Einsatz

Das Factory Pattern stellt einen Mechanismus zur Verfügung um Objekte zu erzeugen, deren konkreter Typ zur Compile-Zeit nicht bekannt ist. Die zu erzeugenden Objekte implementieren normalerweise eine gemeinsame Schnittstelle oder erweitern eine gemeinsame (abstrakte) Basisklasse.

Beispiele

  • Ein Objekt für Datenbankabfragen kann mit Hilfe einer Factory erzeugt werden. Die Konstruktion des Zugriffsobjektes und die direkten Zugriffe hängen von der zu verwendenden Datenbank ab. Die Verwendung des Zugriffsobjektes ist jedoch weitgehend unabhängig von der verwendeten Datenbank.

  • Eine moderne Kaffeemaschine, welche nicht nur normalen Kaffee sondern auch Espresso, Milchkafee, ... herstellen kann ist weiteres Beispiel für eine Factory. Hier ist die Kaffeemaschine eine Factory, welche die Produkte Kaffee, Espresso, ... erzeugen kann.

  • Ein weiteres Beispiel für das Factory Pattern ist die BorderFactory aus dem javax.swing package. Mit Hilfe dieser Klasse werden Objekte erzeugt, die für das Zeichnen der Umrandung von grafischen Komponenten in Swing verantwortlich sind.

Merkmale / Elemente

  • Interface / abtrakte Basisklasse, welche die allgemeine Beschreibung der zu erzeugenden Objekte definiert - Produkt

  • Klassen, die das Interface implementieren (die abstrakte Basisklasse erweitern) - konkretes Produkt

  • Interface / abstrakte Basisklasse deren Methoden die "Fabrik" definieren - Erzeuger

  • Methoden bzw. Klassen, welche die implementierenden Klassen konkret erzeugen. - konkreter Erzeuger

Klassendiagramm

Klassendiagramm Factory Pattern

Beispielhafte Anwendung des Factory-Patterns

Das hier verwendete Beispiel zum Factory-Pattern beschäftigt sich mit der Erzeugung von Getränken. Jedes erzeugte Getränk muss seinen Namen, den Kaloriengehalt und den Alkoholgehalt zur Verfügung stellen.

Die nachfolgende Klasse Getraenk stellt die abstrakte Oberklasse für Getränke dar. Im Factory-Pattern stellt diese Klasse das Produkt dar.

public abstract class Getraenk {
   
  public abstract String getName();
  
  public abstract double getKalorien();
  
  public abstract double getAlkoholgehalt();
}
itmapa.de - X2H V 0.20

Ein konkretes Getränk stellt z.B. Limonade dar. Limonaden können unterschiedliche Kaloriengehalte und Namen haben, aber der Alkoholgehalt einer Limonade ist 0kcal. Eine Limoade entspricht im obigen Klassendiagramm Konkretes_Produkt.

public class Limonade extends Getraenk{
  private String name;
  private double kalorien;
  
  public Limonade(String name, double kalorien){
    this.name = name;
    this.kalorien = kalorien;
  }
  
  public double getAlkoholgehalt(){
    return 0;
  }

  public double getKalorien(){
    return kalorien;
  }

  public String getName(){
    return name;
  }
}
itmapa.de - X2H V 0.20

Ein weiteres Beispiel für ein konkretes Produkt in unserem Beispiel ist die Klasse Wein in der neben Kalorienzahl und Name auch der Alkoholgehlat variiert.

public class Wein extends Getraenk{
  private String name;
  private double kalorien,
                 alkoholgehalt;
  
     
  public Wein(String name, double kalorien, double alkoholgehalt){
    this.name = name;
    this.kalorien = kalorien;
    this.alkoholgehalt = alkoholgehalt;
  }
  
  public double getAlkoholgehalt(){
    return alkoholgehalt;
  }

  public double getKalorien(){
    return kalorien;
  }

  public String getName(){
    return name;
  }
}
itmapa.de - X2H V 0.20

Als nächstes Element des Factory Pattern wollen wir uns in unserem Getränke Beispiel dem Abstrakten Eezeuger widmen. Defniert wird ein abstrakter Getränkeautomat, der für eine int-Konstante ein Getränk liefert.

public abstract class AbstractGetraenkeAutomat {
  
  public abstract Getraenk createGetraenk(int gConstant);
}
itmapa.de - X2H V 0.20

Als abschließendes Element des Factory Pattern folgt nun der GetraenkeAutomat als konkreter Erzeuger:

public class GetraenkeAutomat extends AbstractGetraenkeAutomat{
  public final static int WEIN = 1;
  public final static int LIMONADE = 2;
  
  public Getraenk createGetraenk(int gConstant){
    switch(gConstant) {
      case WEIN: return new Wein("Merlot",70,13);
      case LIMONADE: return new Limonade(Orangenlimonade",50);
      default: return null;
    }    
  }
}

itmapa.de - X2H V 0.20

Pattern Links @ itmapa.de

de.wikipedia.org
Fabrikmethode (Factory)
http://de.wikipedia.org/wiki/Fabrikmethode

Jens Günther
http://wwwswt.informatik.uni-rostock.de
Fabrikmethode
http://wwwswt.informatik.uni-rostock.de/deutsch/Infothek/Entwurfsmuster/patterns/FactoryMethod/index.html

theserverside.de
Factory Method Pattern in Java
http://www.theserverside.de/factory-method-pattern-in-java/