Sobes.tech
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.