Erzeugungsmuster: Erbauer
... [ Seminar Objektorientierter Entwurf] ... [ Thema Entwurfsmuster ] ...
[ Literaturverzeichnis ] ...
bersicht: Erzeugungsmuster: Erbauer
Erbauer
( Builder )
Ist ein objektbasiertes Erzeugungsmuster.
Zweck
Es wird die Repräsentation eines komplexen Objekts von der Konstruktion getrennt.
Es können dadurch unterschiedliche Repräsentationen von einem
Konstruktionsprozeß erzeugt werden.
Motivation
Sie wollen Dokumente in RTF ( Rich Text Format ) einlesen und in einer internen
Repräsentation darstellen. Also wollen Sie RTF in ein Textformat konvertieren
können. Zusätzlich wollen Sie neue Konvertierungen einführen ohne den
Einleser zu modifizieren.
Eine Lösung mit einem Entwurfsmuster ist den RTF-Einleser als eine alleinige
Klasse zu implementieren. Die Textkonvertierer werden von einer abstrakten
Konvertierer-Klasse abgeleitet. Der RTF-Einleser wird mit einer Konvertiererklasse
initialisiert.
Ein RTF-Dokument wird nun von den RTF-Einleser eingelesen und immer wenn ein RTF-Token
(einfacher Text oder RTF-Steuerzeichen) erkannt wird, erhält der Konvertierer einen
Aufruf zur Konvertierung. Der konvertierte Text wird so Stück für Stück
im Textkonvertierer zusammengebaut. Der Textkonvertierer gibt den Text auf Anfrage an
den Klienten zurück.
Anwendbarkeit
Verwenden wenn,
- der Algorithmus, der ein komplexes Objekt erzeugt, unabhängig von den
Bestandteilen und der Zusammensetzung sein soll.
- der Konstruktionsprozeß muß verschiedene Repräsentationen eines
zusammensetzbaren Objekts erlauben.
Struktur
Teilnehmer
- Erbauer
- Abstrakte Schnittstelle zum Erzeugen von Produktteilen.
- Konkreter Erbauer
- Konstruiert und fügt Teile des Produkts zusammen.
- Definiert und verwaltet die erzeugte Repräsentation.
- Bietet eine Schnittstelle zum Zurückgeben der Repräsentation.
- Direktor
- Konstruiert ein Objekt unter der Verwendung der Erbauerschnittstelle.
- Produkt
- Die erstellte Repräsentation.
Interaktion
- Der Klient erzeugt das gewnschte Konkretererbauerobjekt.
- Der Klient erzeugt das Direktorobjekt und initialisiert es mit dem gewünschten
Erbauerobjekt.
- Der Direktor informiert den Erbauer, wenn ein Teil des Produkts gebaut werden soll.
- Der Erbauer bearbeitet die Anfragen des Direktors und fügt Teile zum Produkt
hinzu.
- Der Klient erhält das Produkt vom Erbauer.
Konsequenzen
- Variation der internen Repräsentation eines Produkts
Sie müssen nur eine neue Art Konkreter-Erbauer definieren um eine neue interne
Repräsentation zu bekommen.
- Isolierung des Codes zur Konstruktion und Repräsentation
Durch die Kapselung des Konstruktions- und Repräsentationsprozeßes
verbessert das Erbauermuster die Modularität. Jeder konkrete Erbauer kann
von verschiedenen Direktoren benutzt werden, z.B. statt dem RTF-Einleser ein
HTML-Einleser, der die gleichen Textkonvertierer benutzt.
- Genauere Steuerung des Konstruktionsprozesses
Das Produkt wird Schritt für Schritt durch die Erbauerschnittstelle erzeugt.
Dies ermöglicht eine feinere Steuerung des Konstruktionsprozesses und der
internen Struktur des Produkts.
Implementierung
- Konstruktionsschnittstelle
Die Erbauerklassenschnittstelle muß allgemein genug gehalten werden, damit
die Konstruktion von Podukten aller möglichen konkreten Erbauer
durchführen können.
- Keine abstrakte Produktklasse
Die von den konkreten Erbauern erzeugten Produkte unterscheiden sich so sehr,
daß eine abstrakte Produktklasse keine Vorteile und meist nur Nachteile
bringen würde.
- Leere Methoden als Defaultimplementierung in der Erbaueroberklasse
Die Baue-Operationen werden in der abstrakten Erbauerklasse leer implementiert.
Dadurch brauchen die konkreten Erbauer nur die benötigten Baue-Operationen
überschreiben.
Beispielcode
Die abstrakte Klasse Textkonvertierer:
abstract class Textkonvertierer{
public void KonvertiereZeichen(char c) {};
public void KonvertiereZeichensatz(Zeichensatz z) {};
public void KonvertiereAbsatz() {};
}
Der konkreter Erbauer ASCIIKonvertierer:
public class ASCIIKonvertierer extends TextKonvertierer{
StringBuffer ASCIIText;
public ASCIIKonvertierer() {
ASCIIText = new StringBuffer("");
}
public void KonvertiereZeichen(char c) {
ASCIIText.Add(c);
}
public StringBuffer GibASCIIText() {
Result ASCIIText;
}
}
Der Direktor RTFLeser:
public class RTFLeser{
Textkonvertierer erbauer;
RTFText text;
public RTFLeser(TextKonvertierer k){
erbauer = k;
}
public void LeseRTF_Ein(){... }
public void ParseRTF(){
...
while ( t = text.nextToken )
switch(t.Typ){
case CHAR:
erbauer.KonvertiereZeichen(t.zeichen);
case ZEICHENSATZ:
erbauer.KonvertiereZeichensatz(t.Zeichensatz);
case ABSATZ:
erbauer.KonvertiereAbsatz();
}
...
}
}
Der Klient, der das RTFDokument einlesen und in ASCIIText umwandelt:
public class Klient{
ASCIIKonvertierer Konvertierer;
RTFLeser EinLeser;
StringBuffer Text;
public Klient(){
Konvertierer = new ASCIIKonvertierer;
EinLeser = new RTFLeser(Konvertierer);
EinLeser.LeseRTF_Ein();
Einleser.ParseRTF();
Text = Konvertierer.GibASCIIText();
...
}
}
Bekannte Verwendungen
- Die RTF-Konvertierer-Anwendung stammt aus ET++
( Ein objektorientiertes Applikations Framework )
- In Smalltalk-80 ist der Erbauer ein bekanntes Muster
Verwandte Muster
- Das Abstrakte-Fabrik-Muster konstruiert ebenfalls komplexe Objekte. Der Erbauer
gibt das Produkt als letzten Schritt zurück, während das
Abstrakte-Fabrik-Muster das Produkt unmittelbar zurückgibt.
- Erbauer bauen oftmals Komposita.
... [ Seminar Objektorientierter Entwurf] ... [ Thema Entwurfsmuster ] ... [ Erzeugungsmuster: Erbauer ] ... [ Literaturverzeichnis ] ...