|
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.
|
|
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(); }
}
|
|
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.
|