Builder-Muster
Das Builder-Muster trennt die Konstruktion eines komplexen Objekts von seiner Darstellung, sodass derselbe Prozess verschiedene Darstellungen erzeugen kann. Verwende es, wenn die Objektkonstruktion viele unabhängig variierende Schritte oder Konfigurationen erfordert.
Überblick
Das Builder-Muster zerlegt die Konstruktion eines komplexen Objekts in diskrete Schritte, die von einem Builder-Objekt bereitgestellt werden. Der Client ruft die Schritte auf, die ihn interessieren, in beliebiger Reihenfolge, und fragt den Builder dann nach dem Endergebnis. Es glänzt, wenn ein Konstruktor sonst ein Dutzend Parameter bräuchte, davon die Hälfte optional.
Wann verwenden
- Ein Objekt hat viele optionale Felder oder Konfigurationsschritte, und Konstruktor-Überladung würde explodieren.
- Du willst, dass derselbe Konstruktionsprozess verschiedene Darstellungen erzeugt (z.B. eine Query, die als SQL oder als parametrisiertes Objekt rendert).
- Du willst, dass die Konstruktion an der Aufrufstelle flüssig und selbsterklärend ist.
Beispiel
class Pizza {
size: string = "M";
cheese = false;
pepperoni = false;
mushrooms = false;
}
class PizzaBuilder {
private pizza = new Pizza();
size(size: string) { this.pizza.size = size; return this; }
addCheese() { this.pizza.cheese = true; return this; }
addPepperoni() { this.pizza.pepperoni = true; return this; }
addMushrooms() { this.pizza.mushrooms = true; return this; }
build(): Pizza { return this.pizza; }
}
const pizza = new PizzaBuilder()
.size("L")
.addCheese()
.addMushrooms()
.build();Vorteile
- Konstruiert komplexe Objekte Schritt für Schritt ohne teleskopische Konstruktoren.
- Eine flüssige API macht die Absicht an der Aufrufstelle offensichtlich.
- Dasselbe Builder-Protokoll kann verschiedene konkrete Ergebnisse erzeugen (Director + Builder).
Nachteile
- Mehr Code als ein einfacher Konstruktor — verschwendeter Aufwand, wenn das Objekt klein ist.
- Veränderlicher Builder-Zustand kann lecken, wenn du dieselbe Instanz wiederverwendest.
- Validierung muss in `build()` leben statt im Konstruktor.