Mit Factory-Pattern Designprobleme lösen

Marja-Liisa Jöckel

Factory-Design-Pattern sind die am häufigsten verwendeten Muster in einer Objekt-orientierten Umgebung. Da die Objekterstellung manchmal sehr komplex ist, kommt man bei der Implementierung häufig nicht an einer Abstraktion vorbei. Die Factory-Pattern-Methode definiert dabei ein Interface für die Erstellung von Objekten und delegiert die Objekterstellung an die Sub-Klassen. Ziel ist, dass der Client nichts von der Objekt-Instantiierung mitbekommt und über eine gemeinsame Schnittstelle auf die Objekte zugreift. Factory-Patterns kapseln dadurch den Creation Code vom Client.

Die Factory-Design-Pattern-Methode wird in vielen verschiedenen Frameworks wie beispielsweise Struts oder Spring verwendet. Zudem existieren verschiedene J2EE-Patterns, die auf dem Factory-Design-Pattern basieren, wie zum Beispiel das DAO Pattern.

Gängige Praxis ist, ein Objekt über den Aufruf „new“ zu erstellen. Im nachfolgenden Szenario werden mehrere „New“ Schlüsselwörter für die Erstellung neuer Objekte verwendet. Dadurch wird eine Abhängigkeit zum Client-Code erzeugt, was Probleme bei der Wartung mit sich bringt. Außerdem muss der Client im Voraus wissen, wieviele konkrete Klassen zur Verfügung stehen. Will man eine weitere konkrete Klasse hinzufügen, wie zum Beispiel eine Jacke, muss der Client-Code geändert und neu kompiliert werden.

Code Beispiel

if (selection.equalsIgnoreCase("Trouser")) {
            return new Trouser();
        } else if (selection.equalsIgnoreCase("Shirt")) {
            return new Shirt();
        }  

Mithilfe einer Factory-Klasse kann das Problem mit dem Zugriff auf zu viele neue Schlüsselwörter gelöst werden. Mittels einer Schnittstelle für die Implementierung konkreter Klassen wird der Client stets auf die Interface-Klasse anstatt auf die konkreten Klassen verweisen. Somit muss der Client nichts über die unterschiedlichen Typen der konkreten Klassen wissen.

Interfaces in Java

Eine Schnittstelle in Java dient der Sammlung von Methoden-Definitionen ohne Implementierung. Die Klasse, die das Interface umsetzt, muss dabei sämtliche Methoden implementieren, die in der Schnittstelle beschrieben werden.

interface Bounceable {
      void setBounce();
}  

Folgendes Diagramm zeigt die Umsetzung eines Factory Patterns:

Der entsprechende Code sieht so aus:

GarmetType.java

public interface GarmentType {
    String print();
}  

Trousers.java

public class Trouser implements GarmentType {
    @Override
    public String print() {
        System.out.println("Trouser Created");
        return "Trouser";
    }
 
}  

Shirt.java

public class Shirt implements GarmentType {
    @Override
    public String print() {
        System.out.println("Shirt Created");
        return "Shirt";
    }
}  

GarmentFactory.java

public class GarmentFactory {
    public static GarmentType createGarments(String selection) {
        if (selection.equalsIgnoreCase("Trouser")) {
            return new Trouser();
        } else if (selection.equalsIgnoreCase("Shirt")) {
            return new Shirt();
        }
        throw new IllegalArgumentException("Selection doesnot exist");
    }
}  

Client.java

public class Client {
    public static void main(String[] args) {
        System.out.println("Enter your selection:");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String selection = null;
        try {
            selection = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        GarmentType objGarmentType = GarmentFactory.createGarments(selection);
        System.out.println(objGarmentType.print());
    }
}  

Die Vorteile der Design-Pattern-Methode:

  • Der Client muss die Sub-Klassen der Objekte nicht kennen. Lediglich die Referenz zum Interface und das Factory-Objekt werden benötigt.
  • Der Objekt-Erstellungsprozess ist vom Client losgelöst. Dies macht eine Wiederverwendbarkeit des Codes möglich.
  • Die Wartbarkeit des Codes ist einfacher, da die Objekt-Erstellung zentralisiert stattfindet.
Geschrieben von
Marja-Liisa Jöckel
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.