Erbauer (Entwurfsmuster)

Erbauer (Entwurfsmuster)

Der Erbauer (englisch Builder) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Erzeugungsmuster (Creational Patterns). Es trennt die Konstruktion komplexer Objekte von deren Repräsentationen, wodurch dieselben Konstruktionsprozesse wiederverwendet werden können. Das Muster ist eines der sogenannten GoF-Muster (Gang of Four, siehe Viererbande).

Inhaltsverzeichnis

Verwendung

Softwareentwickler verwenden den Erbauer, wenn zu einem komplexen Objekt unterschiedliche Repräsentationen existieren sollen, die Konstruktion eines komplexen Objekts unabhängig von der Erzeugung der Bestandteile sein soll oder der Konstruktionsablauf einen internen Zustand erfordert, den man vor einem Klienten verbergen möchte.

Typische Anwendungen sind z.B. Applikationen zur Konvertierung.

UML-Diagramm: Erbauer

Akteure

Man kann vier Akteure unterscheiden: Erbauer, KonkreterErbauer, Direktor und Produkt. Der Erbauer spezifiziert eine abstrakte Schnittstelle zur Erzeugung der Teile eines komplexen Objektes. KonkreterErbauer erzeugt die Teile des komplexen Objekts durch Implementierung der Schnittstelle. Außerdem definiert und verwaltet er die von ihm erzeugte Repräsentation des Produkts. Er bietet auch eine Schnittstelle zum Auslesen des Produkts.

Der Direktor konstruiert ein komplexes Objekt unter Verwendung der Schnittstelle des Erbauers. Der Direktor arbeitet eng mit dem Erbauer zusammen: Er weiß, welche Baureihenfolge der Erbauer verträgt oder benötigt. Der Direktor entkoppelt somit den Konstruktionsablauf vom Klienten. Das Produkt repräsentiert das zu konstruierende komplexe Objekt.

Vorteile

Die Implementationen der Konstruktion und der Repräsentationen werden isoliert. Die Erbauer verstecken ihre interne Repräsentation vor dem Direktor. Neue Repräsentationen lassen sich leicht durch neue konkrete Erbauerklassen einfügen. Der Konstruktionsprozess wird an einer dedizierten Stelle (im Direktor) gesteuert; spätere Änderungen - etwa ein Mehrphasen-Konstruktionsprozess statt einer Einphasen-Konstruktion - lassen sich ohne Änderung der Klienten realisieren.

Variante

Man kann auch das Produkt selber die Erbauer-Schnittstelle implementieren lassen. Dadurch erspart man sich u.U. einige Klassen. Das erzeugte Produkt „schleppt“ die Erbauer-Schnittstelle sein ganzes Leben mit sich herum, sodass auch später von außen Produktteile angebaut werden können.

Verwendung in der Analyse

Dieses Muster wird in der Software-Analyse wegen der schwierigen Metapher selten verwendet.

Die Variante allerdings, bei der ein Objekt selbst Verfahren zur Verfügung stellt, um weitere Teile „anzubauen“, bewährt sich in pipeline-artigen Business-Prozessen. Der Business-Prozess als Direktor weist das Dokument als Erbauer an, neue Teile zu erzeugen und in sich einzuhängen. Beispielsweise kann eine Aktenverwaltung in einzelnen Schritten Vermerke an einen „Aktenlauf“ anhängen.

Beispiel

Eine Börsensoftware hält Aktienkurse in einer Textdatei in folgendem Format fest: Pro Aktiengesellschaft werden in einer Zeile, durch Leerzeichen getrennt, Wertpapierkennnummer, Name der Aktiengesellschaft, Kurs und gehandelte Stückzahl gespeichert:

515100 BASF          36,84  2850400
803200 Commerzbank    6,71  17231300
...

Nun soll dieses Format in ein „modernes“ Format wie CSV oder XML umgewandelt werden. Wird im CSV-Format das Semikolon als Trennzeichen benutzt, so soll obige Datei beispielsweise in folgende umgewandelt werden:

515100;BASF;36,84;2850400
803200;Commerzbank;6,71;17231300

Im XML-Format dagegen könnte das Ergebnis der Umwandlung so aussehen:

<Aktienkurse>
        <Aktie>
                <WKN>515100</WKN>
                <Name>BASF</Name>
                <Kurs>36,84</Kurs>
                <Stueckzahl>2850400</Stueckzahl>
        </Aktie>
        <Aktie>
                <WKN>803200</WKN>
                <Name>Commerzbank</Name>
                <Kurs>6,71</Kurs>
                <Stueckzahl>17231300</Stueckzahl>
        </Aktie>
</Aktienkurse>


Das folgende C++-Programm zeigt den Einsatz des Erbauer-Musters in einer Applikation zur Datenformat-Umwandlung, die leicht um weitere Ausgabeformate erweiterbar ist. Der Direktor (Klasse KursdatenLeser) weiß, wie Daten im Altformat einzulesen und zu parsen sind. Er kennt einen Erbauer, der geparste Teile in sein jeweiliges Format übersetzen kann. Alle konkreten Erbauer sind konkrete Unterklassen der abstrakten Klasse KursdatenBauer. Z. B. übersetzt die Klasse XMLKursdatenBauer geparste Zeilen in ein XML-Format.

Der Klient kann dem Direktor den konkreten Erbauer zur Laufzeit mitteilen. So kann das Ausgabeformat zur Laufzeit gewechselt werden.

Um ein neues Ausgabeformat zu unterstützen, muss nur die Klasse KursdatenBauer entsprechend durch eine konkrete Unterklasse implementiert werden, z. b. durch LaTeXKursdatenBauer.

Wichtig ist bei diesem Muster Folgendes: Es sind nicht nur die erzeugten Einzelteile, die Komplexität besitzen (darum kümmern sich die konkreten Erzeuger), sondern auch das zu erzeugende Ganze ist ein komplexes Objekt, um dessen Erzeugung sich der Direktor kümmert. Der Direktor ist also der „Fachmann“ für die Erzeugung des Produktes; er alleine kennt die notwendigen Einzelschritte. Im Beispiel weiß er alleine, wie das Altformat zu parsen und daraus das neue Format zusammenzusetzen ist.

#include <iostream>
#include <string>
 
using std::string;
using std::cout;
 
// Abstrakter Erbauer
 
class KursdatenBauer {
public:
  virtual void schreibeKursdaten(const string& wkn, const string& name, 
                                 const string& kurs, const string& stueckzahl) 
                                 = 0;
  virtual void initialisiereSchreiben() {}
  virtual void beendeSchreiben() {}
};
 
// Konkreter Erbauer für CSV-Dateien
 
class CSVKursdatenBauer : public KursdatenBauer {
  // Hier entsteht das Produkt, der Einfachheit halber auf die
  // Standardausgabe geschrieben. (Es könnte auch in einen Stream
  // geschrieben werden, der im Konstruktor übergeben wird.)
  virtual void schreibeKursdaten(const string& wkn, const string& name, 
                                 const string& kurs, const string& stueckzahl) {
    cout << wkn << ";" << name << ";" 
         << kurs << ";" << stueckzahl << "\n";
  }  
};
 
// Konkreter Erbauer für XML-Dateien
 
class XMLKursdatenBauer : public KursdatenBauer {
  virtual void schreibeKursdaten(const string& wkn, const string& name, 
                                 const string& kurs, const string& stueckzahl) {
    cout << "\t<Aktie>" << "\n";
    cout << "\t\t<WKN>" <<  wkn << "</WKN>\n";
    cout << "\t\t<Name>" << name << "</Name>\n";
    cout << "\t\t<Kurs>" << kurs<< "</Kurs>\n";
    cout << "\t\t<Stueckzahl>" << stueckzahl << "</Stueckzahl>\n";
    cout << "\t</Aktie>\n";
  }  
 
  virtual void initialisiereSchreiben() {
    cout << "<Aktienkurse>" << "\n";
  }
 
  virtual void beendeSchreiben() {
    cout << "</Aktienkurse>" << "\n";
  }
};
 
// Direktor
 
class KursdatenLeser {
private:
  KursdatenBauer* _kursdatenBauer;
public:
  void setKursdatenBauer(KursdatenBauer* kb) {
    _kursdatenBauer = kb;
  }
 
  void parseUndSchreibeKursdaten() {
    _kursdatenBauer->initialisiereSchreiben();
    // lies Zeile für Zeile von STDIN und zerlege in geeignete Teile
    while( ! std::cin.eof() ) {
       string wkn, name, kurs, stueckzahl;
       std::cin >> wkn >> name >> kurs >> stueckzahl;
       if( wkn.empty() ) { break; }
       _kursdatenBauer->schreibeKursdaten(wkn, name, kurs, stueckzahl);
     }
    _kursdatenBauer->beendeSchreiben();
  }
};
 
// Klient
 
int main() {
  CSVKursdatenBauer csvKursdatenBauer;
  XMLKursdatenBauer xmlKursdatenBauer;
  KursdatenLeser    kursdatenLeser;
 
  kursdatenLeser.setKursdatenBauer( &xmlKursdatenBauer );
  // oder
  // kursdatenLeser.setKursdatenBauer( &csvKursdatenBauer );
  kursdatenLeser.parseUndSchreibeKursdaten();
}

Verwandte Entwurfsmuster

Die abstrakte Fabrik ähnelt dem Erbauer, weil sie ebenfalls komplexe Objekte erzeugen kann. Dabei steht aber nicht die Struktur im Vordergrund, sondern die Abstraktion vom konkreten Typ der erzeugten Objekte. Der Erbauer erzeugt oft ein Kompositum (Entwurfsmuster). Bei Applikationen zur Konvertierung ist der Direktor - oder sogar der Erbauer - oft ein Visitor (Besucher) oder eventuell ein Interpreter (Entwurfsmuster) der Struktur, die konvertiert werden soll.


Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Erbauer — steht für: ein anderer Ausdruck für Architekt einen Begriff aus der Informatik, siehe Erbauer (Entwurfsmuster) Diese Seite ist eine Begriffsklärung zur Unterscheidung mehrerer mit demselben Wort bezeichneter Begriffe …   Deutsch Wikipedia

  • Entwurfsmuster — (engl. design patterns) sind bewährte Lösungsschablonen für wiederkehrende Entwurfsprobleme in Softwarearchitektur und Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem bestimmten… …   Deutsch Wikipedia

  • Entwurfsmuster (Buch) — Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software, ISBN 3 8273 2199 9 (Originaltitel: Design Patterns. Elements of Reusable Object Oriented Software.) ist ein 1994 von Erich Gamma, Richard Helm, Ralph Johnson und John… …   Deutsch Wikipedia

  • Singleton (Entwurfsmuster) — Das Singleton (auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster (engl. Creational Patterns). Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt… …   Deutsch Wikipedia

  • Builder (Entwurfsmuster) — Der Erbauer (englisch Builder) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Erzeugungsmuster (Creational Patterns). Es trennt die Konstruktion komplexer Objekte von deren Repräsentationen, wodurch… …   Deutsch Wikipedia

  • Einzelstück (Entwurfsmuster) — Das Singleton (auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster (engl. Creational Patterns). Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt… …   Deutsch Wikipedia

  • Design Pattern — Entwurfsmuster (engl. design pattern) sind bewährte Lösungs Schablonen für wiederkehrende Entwurfsprobleme der Softwarearchitektur und Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem… …   Deutsch Wikipedia

  • Design Patterns — Entwurfsmuster (engl. design pattern) sind bewährte Lösungs Schablonen für wiederkehrende Entwurfsprobleme der Softwarearchitektur und Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem… …   Deutsch Wikipedia

  • Design pattern — Entwurfsmuster (engl. design pattern) sind bewährte Lösungs Schablonen für wiederkehrende Entwurfsprobleme der Softwarearchitektur und Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem… …   Deutsch Wikipedia

  • Dekorierer — Der Decorator (auch Dekorierer) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Strukturmuster (Structural Patterns). Das Muster ist eine flexible Alternative zur Unterklassenbildung, um eine Klasse um… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”