Middle
Erzählen Sie mir vom Entwurfsmuster Builder (Builder).
sobes.tech KI
Antwort von AI
Builder ist ein Erzeugungsmuster, das die schrittweise Erstellung komplexer Objekte ermöglicht.
Es wird angewendet, wenn:
- Der Erstellungsprozess eines Objekts komplex ist und mehrere Schritte umfasst.
- Es notwendig ist, verschiedene Darstellungen desselben Objekts zu erstellen.
- Der Konstruktor des Objekts viele optionale Parameter hat.
Das Muster besteht aus den folgenden Rollen:
- Builder: Schnittstelle, die die Schritte zum Aufbau des Objekts definiert.
- ConcreteBuilder: Konkrete Implementierung des Builders, die die Aufbau-Schritte ausführt und die Methode zur Rückgabe des fertigen Objekts bereitstellt.
- Product: Das komplexe Objekt, das gebaut wird.
- Director (optional): Bestimmt die Reihenfolge der Aufruf der Aufbau-Schritte.
Beispiel für eine Implementierung in Golang ohne Director:
// Product - das Objekt, das wir bauen
type Pizza struct {
Dough string
Sauce string
Toppings []string
}
// Builder - Schnittstelle des Bauherrn
type PizzaBuilder interface {
SetDough(dough string) PizzaBuilder
SetSauce(sauce string) PizzaBuilder
AddTopping(topping string) PizzaBuilder
Build() Pizza // Methode zum Erhalten des fertigen Objekts
}
// ConcreteBuilder - konkrete Implementierung des Bauherrn
type HawaiianPizzaBuilder struct {
pizza Pizza
}
func NewHawaiianPizzaBuilder() *HawaiianPizzaBuilder {
return &HawaiianPizzaBuilder{}
}
func (b *HawaiianPizzaBuilder) SetDough(dough string) PizzaBuilder {
b.pizza.Dough = dough
return b
}
func (b *HawaiianPizzaBuilder) SetSauce(sauce string) PizzaBuilder {
b.pizza.Sauce = sauce
return b
}
func (b *HawaiianPizzaBuilder) AddTopping(topping string) PizzaBuilder {
b.pizza.Toppings = append(b.pizza.Toppings, topping)
return b
}
func (b *HawaiianPizzaBuilder) Build() Pizza {
return b.pizza
}
// Beispiel für die Verwendung
func main() {
// Erstellen des Builders für hawaiianische Pizza
builder := NewHawaiianPizzaBuilder()
// Schrittweises Bauen der Pizza
pizza := builder.
SetDough("dünn").
SetSauce("Tomate").
AddTopping("Ananas").
AddTopping("Schinken").
Build() // Erhalten der fertigen Pizza
fmt.Printf("Erstellte Pizza: %+v\n", pizza)
}
Vorteile des Musters:
- Ermöglicht die Trennung des Erstellungsprozesses eines komplexen Objekts von seiner Darstellung.
- Bietet eine schrittweise Konstruktion des Objekts.
- Erleichtert die Erstellung verschiedener Darstellungen desselben Objekts.
- Macht den Code zur Objekterstellung lesbarer und wartbarer bei vielen Parametern.
Nachteile des Musters:
- Erhöht die Anzahl der Klassen im Projekt.
- Kann für einfache Objekte übertrieben sein.