Mittwoch, 4. September 2013

Das Factory Pattern – Glaube und Wirklichkeit – eine konkrete Nachlese

Praktisches Beispiel 2.1.3

Artikelübersicht
1. Teil Das Factory Pattern – Glaube und Wirklichkeit – Teil 1
2. Teil Das Factory Pattern – Glaube und Wirklichkeit – Teil 2.
3. Teil Das Factory Pattern – Glaube und Wirklichkeit – eine konkrete Nachlese.


Zum zweiten Teil der Reihe Das Factory Pattern – Glaube und Wirklichkeit hat Torsten Robitzki mir geschrieben, dass ich extrem abstrakt geblieben bin. Seiner Meinung nach birgt das die Gefahr, dass vielleicht nicht alle das gleiche Verständnis entwickeln. Diese Kritik fand ich sehr berechtigt. Leider fehlte mir ein konkretes Beispiel und deshalb hatte ich Torsten gebeten ein Beispiel zu entwickeln. Dieser Bitte kam Torsten nach und ich bin ihm sehr dankbar dafür. Im nachfolgenden Text stelle ich sein Beispiel dar.


In meinem abstrakten Beispiel gab es A- und B-Komponenten, die entsprechende Implementierungen aufwiesen. Torsten hat als Komponenten einen Logger und eine RemotConnection vorgeschlagen. Davon gibt es die konkreten Implementierungen FileLogger und NullLogger für den Logger und TcpConnection und SimulatedConnection für die RemoteConnection.

  

public interface Logger {
 void log(String msg);
}

public interface RemoteConnection {
    void write(String msg);
    String read();
    void close();
}

public class FileLogger implements Logger {
 
    public FileLogger(String fileName) {
        System.out.println("Konstruktor FileLogger" + fileName);
    }
    
    @Override
    public void log(String msg) {
        System.out.println("FileLogger " + msg);
    }

}

public class NullLogger implements Logger {

    @Override
    public void log(String msg) {
         System.out.println("Der NullLogger.");
    }

}

public class TCPConnection implements RemoteConnection {

    public TCPConnection(String connectionParamter) {
  System.out.println("Konstruktor TCPConnection : "
            + connectionParamter);
    }

    @Override
    public void write(String msg) {
         System.out.println("TCPConnection write.");
    }

    @Override
    public String read() {
         System.out.println("TCPConnection read.");
         return null;
    }

    @Override
    public void close() {
         System.out.println("TCPConnection close.");
    }

}

public class SimulatedConnection implements RemoteConnection {
 
    public SimulatedConnection(String connectionParamter, 
      String simulatedOutput[]) {
         System.out.println();
    }
 
    @Override
    public void write(String msg) {
         System.out.println("SimulatedConnection write " + msg);
    }

    @Override
    public String read() {
         System.out.println("SimulatedConnection read ");
         return null;
    }
    
    @Override
    public void close() {
         System.out.println("SimulatedConnection close ");
    }
}



Die println-Methoden sollen nur Verhalten andeuten, dass hier nicht implementiert wurde. Die abstrakte Factory heißt bei Torsten FacilityFactory und wird von zwei Klassen implementiert, ProductionFactory und TestingFactory.

 

public interface FacilityFactory {
    Logger createLogger();
    RemoteConnection createConnection(String connectionParamter);
}

public class ProductionFactory implements FacilityFactory {
    public Logger createLogger() {
      return new FileLogger("production.log");
    }

    public RemoteConnection 
    createConnection(String connectionParamter) {
      return new TCPConnection(connectionParamter);
    }
}

public class TestingFactory implements FacilityFactory {
    public Logger createLogger() {
        return new NullLogger();
    }
     
    public RemoteConnection 
    createConnection(String connectionParamter) {
        return new SimulatedConnection(connectionParamter, 
           new String[] {"400","200"});
    }
}



Zum Schluss wird das Ganze in der Klasse Calculator angewendet.

 

public class Calculator {
    public static void calculate(FacilityFactory factory) {
        Logger log = factory.createLogger();
        log.log("start calculating...");
        
        RemoteConnection connection = 
           factory.createConnection("127.0.0.1:8080");
        String result = connection.read();
        
        connection.close();
        log.log("done.");
    }
}



Dieses konkrete Beispiel führt, so hoffe ich, zu einem besseren Verständnis und vielleicht auch zu einer Vorstellung, wie dieses Pattern angewendet werden kann. Vielleicht könntet Ihr in den Kommentaren weitere Beispiele für die Anwendung aufzählen oder von Euren Erfahrungen berichten.

vorheriger Post dieses Themas


Print Friendly Version of this page Print Get a PDF version of this webpage PDF

Keine Kommentare:

Kommentar veröffentlichen