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.


erbauer1.gif nicht gefunden...

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,


Struktur


erbauer2.gif nicht gefunden...


Teilnehmer


Interaktion


erbauer3.gif nicht gefunden...


Konsequenzen

  1. 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.
  2. 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.
  3. 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

  1. Konstruktionsschnittstelle
    Die Erbauerklassenschnittstelle muß allgemein genug gehalten werden, damit die Konstruktion von Podukten aller möglichen konkreten Erbauer durchführen können.
  2. 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.
  3. 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


Verwandte Muster


... [ Seminar Objektorientierter Entwurf] ... [ Thema Entwurfsmuster ] ... [ Erzeugungsmuster: Erbauer ] ... [ Literaturverzeichnis ] ...