Erbauer [ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]


Beispiel

Sie sind ein erfolgreicher Hersteller von Öltankern. Der Konstruktionsprozess für einen solchen Tanker in der Werft ist soweit eingegrenzt, dass die Hauptaufgaben sich unterteilen lassen in: (1) das Schiff auf Kiel legen, (2) den Schiffsrumpf fertigen und (3) die Antriebsmaschine einbauen.
Eines Tages kam ihr Sohn zu Ihnen und fragte, ob Sie nicht auch so einen Tanker als Spielzeug bauen könnten. Nach kurzem Überlegen kamen Sie zu der Schlussfolgerung, dass die Konstruktion eines solchen Spielzeugs sich exakt auf die gleiche Weise vornehmen ließe, wie bei dem großen Vorbild. Also bauten Sie eine neue Werft und konstruieren seit dem mit dem gleichen Prozess Spielzeugtanker.

Das Java-Applet wurde mit der J2SE 1.5.0 entwickelt.




Beschreibung

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

Der «Director» des Beispiels wird durch die Klasse ShipManufacturer implementiert. Wird ein Objekt dieser Kasse instanziiert, so muss dem Konstuktor ein «Builder»-Objekt übergeben werden. Die Ausführung der Konstruktion des jeweiligen Produktes wird durch den Aufruf der Methode construct() ausgeführt (s.a. Abb. 2):

  public class ShipManufacturer
  {
    public ShipManufacturer( Shipyard shipyard ) {...}
    public void construct() {...}
  }
Die abstrakte Klasse Shipyard stellt somit den «Builder» dar. Sie definiert die Methoden und - indirekt - den Ablauf den Konstruktionsprozess zur Konstruktion eines «Product» Ship:
  public abstract class Shipyard
  {
    public abstract void buildShip();
    public void buildHull() {}
    public void buildEngine() {}
  }
Durch die abstrakte Definition der Methode buildShip() wird sichergestellt, dass Instanzen der «ConcreteProduct»-Objekte durch die Subklasssen erstellt werden. Die leeren Implementationen der beiden anderen Methoden erlaubt es folglich, weniger komplex gestaltete Ship-Untertypen zu definieren.

Das «Product» Ship definiert 3 abstrakte Klassen, wobei die Klasse Ship die Hauptklasse darstellt. Weiterhin werden die abstrakten Klassen Hull und Engine spezifiziert, die über Kompositionsrelationen mit der Klasse Ship verbunden sind (s. Abb. 2).

[klick] zum vergrössern
 Abb. 3: Subklassen von «Builder» und «Product» im Beispiel

Das Beispiel verwendet zwei konkrete Produkte und entsprechend zwei konkrete Erbauer. Die konkreten Builder sind die Klassen ToyShipyard und OiltankerShipyard. Ersterer konstruiert das «ConcreteProduct» OiltankerToy mit den Teilen PlasticHull und WindUpEngine. Zweiterer erzeugt Objekte der Klasse Oiltanker mit den Teilen SteelHull und DieselEngine(s. Abb. 3).
Diese konkreten Erbauer können nun wahlweise bei der Instanziierung eines ShipManufacturer-Objekts angegeben werden. Nachdem die Konstruktion der konkreten Produkte ausgeführt wurde, kann der Client sich diese von den konkreten Erbauern über die Methoden getShip():OiltankerToy bzw. getShip():Oiltanker zurückgeben lassen.


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