Erbauer (Entwurfsmuster)
# Erbauer (Entwurfsmuster)

Der Erbauer (englisch builder) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung. Es gehört zur Kategorie der Erzeugungsmuster (englisch creational patterns) und 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).

## Verwendung

Der Einsatz des Erbauer-Entwurfsmusters bietet sich an, 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, der vor einem Klienten verborgen werden soll.

Typische Anwendungen sind z. B. Anwendungsprogramme zur Konvertierung.

## Akteure

Man kann vier Akteure unterscheiden: Direktor, Erbauer, KonkreterErbauer und Produkt. Der Erbauer spezifiziert eine abstrakte Schnittstelle zur Erzeugung der Teile eines komplexen Objektes. Der konkrete Erbauer 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 Implementierungen 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.

## Nachteile

Es besteht eine enge Kopplung zwischen Produkt, konkretem Erbauer und den am Konstruktionsprozess beteiligten Klassen.

## 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, bei der ein Objekt selbst Verfahren zur Verfügung stellt, um weitere Teile anzubauen, ist vorteilhaft in Pipeline-artigen Geschäftsprozessen. Der Geschäftsprozess 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

Diese C++11 Implementierung basiert auf der vor C++98 Implementierung im Buch Entwurfsmuster.

Die Programmausgabe ist ähnlich zu:

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:

Nun soll dieses Format in ein 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:

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

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 KursdatenUmwandler) 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. Beispielsweise ü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 allein kennt die notwendigen Einzelschritte. Im Beispiel weiß allein er, wie das Altformat zu parsen und daraus das neue Format zusammenzusetzen ist.

## 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 Besucher oder eventuell ein Interpreter (Entwurfsmuster) der Struktur, die konvertiert werden soll.

