Abstrakte Fabrik [ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]


Beispiel

Stellen Sie sich vor, sie leben im 14.Jh. und sind Besitzer einer Schiffswerft zu Rostock. Wie es sich für einen erfolgreichen Unternehmer gehört, möchten Sie ihren Kunden alle Wünsche erfüllen, eine möglichst breite Paletten an herstellbaren Schiffen anbieten. Aus Gründen, die nur ihnen bekannt sind, wollen Sie sich nicht mit der Projektierung aller Schiffstypen und deren Einzelteile beschäftigen. Ihr Unternehmenszweck besteht lediglich im Zusammenbau der Schiffe. Die Projektierung der Schiffe und die Herstellung der Komponenten überlassen Sie spezialisierten Fabriken, die ihnen zuliefern und dafür garantieren, dass die Einzelteile gewisse abstraktere Definitionen erfüllen.

Das Java-Applet wurde mit der J2SE 1.4.2 entwickelt.
Die verwendeten Bilder stammen aus dem Spiel "Patrizier II: Aufstieg der Hanse"
(mit freundlicher Genehmigung von Ascaron Entertainment).




Beschreibung

[klick] zum vergrössern
 Abb. 2: Abstrakte Definitionen des Beispiels

In diesem Beispiel stellt die Klasse Shipyard den «Client» des Patterns dar:

  public class Shipyard
  {
    public void setShipFactory( ShipFactory factory ){...}
    public Ship assembleShip(){...}	
  }
	
Die ShipFactory ist die «AbstractFactory» und definiert abstrakte Methoden zur Erzeugung der Produkte Hull, Masts, Sails und Ship:

  public abstract class ShipFactory
  {
    public abstract Hull createHull();
    public abstract Masts createMasts();
    public abstract Sails createSails();
    public abstract Ship createShip();
  }
	

Die Objekte der implementierten Klasse Ship enthalten Objekte der zuvor genannten Klassen mit der Bedingung, dass die Komponenten dem Schiffstyp entsprechen.

[klick] zum vergrössern
 Abb. 3: Hierarchie ShipFactory

Um nun spezielle Ausprägungen der Schiffskomponenten zu realisieren und einen einfachen Zugriff auf die Erzeugung entsprechender Objekte zu realisieren, enthät das Beispiel 4 Implementationen der ShipFactory (Abb. 3). Alle Fabriken wurden als «Singleton» konzipiert, es existiert also jeweils nur ein Objekt einer Klasse zur Laufzeit, als Beispiel die SchniggeFactory:

  public class SchniggeFactory extends ShipFactory 
  {
    // statische Variable zum Halten des Singleton-Objektes
    private static ShipFactory	itsSingleton;
    
    // statische Methode zur Rückgabe des Singleton-Objektes
    public static ShipFactory getShipFactory(){
        if( itsSingleton == null )	itsSingleton = new SchniggeFactory();
        return itsSingleton;
    }
    
    private SchniggeFactory(){...}
    
    public Hull createHull()   { return new SchniggeHull(); }
    public Masts createMasts() { return new SchniggeMasts(); }
    public Sails createSails() { return new SchniggeSails(); }
    public Ship createShip()   { return new Schnigge(); }
  }
	

[klick] zum vergrössern
 Abb. 4: Hierarchie ShipFactoryProduct

Jede dieser Fabriken erzeugt nun spezielle Objekte der abstrakten Klassen Hull, Masts, Sails und Ship (Abb. 4). Der aufmerksame Leser mag nun hier anmerken, dass doch im Prinzip schon die Fabrik das Schiff zusammensetzen könnte. Für dieses einfache Beispiel ist dies' auch richtig, man kann sich jedoch für umfangreichere Szenarien komplexere Zusammenhänge vorstellen. Denkbar wäre eine Verfeinerung der Komponenten hinsichtlich dem verarbeiteten Material ( Holz, Eisen, Plastik, weißes oder braunes Segeltuch...). Die Klasse Shipyard sollte dann in der Lage sein, variabel die Komponenten eines Schiffstyps zu einem Objekt der Klasse Ship zusammenzusetzen, unabhängig von deren weiteren Verfeinerung, also bspw. eine Kogge mit Plastikrumpf, Aluminiummast und Hightechfasersegel.


[ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]
Stand: 15.08.2004, Autor: Jens Günther