Sobes.tech
Middle

Vertel me over het ontwerp patroon Builder (Bouwer).

sobes.tech AI

Antwoord van AI

Builder is een creational pattern dat het mogelijk maakt om complexe objecten stapsgewijs te creëren.

Het wordt toegepast wanneer:

  • Het proces van het creëren van een object complex is en meerdere stappen omvat.
  • Het nodig is om verschillende weergaven van hetzelfde object te maken.
  • De constructor van het object veel optionele parameters heeft.

Het patroon bestaat uit de volgende rollen:

  • Builder: Interface die de stappen voor het bouwen van het object definieert.
  • ConcreteBuilder: Concrete implementatie van Builder die de bouwstappen uitvoert en de methode biedt om het voltooide object te verkrijgen.
  • Product: Het complexe object dat wordt gebouwd.
  • Director (optioneel): Bepaalt de volgorde van de aanroepen van de bouwstappen.

Voorbeeld van implementatie in Golang zonder Director:

// Product - het object dat we bouwen
type Pizza struct {
	Dough   string
	Sauce   string
	Toppings []string
}

// Builder - interface van de bouwer
type PizzaBuilder interface {
	SetDough(dough string) PizzaBuilder
	SetSauce(sauce string) PizzaBuilder
	AddTopping(topping string) PizzaBuilder
	Build() Pizza // Methode om het voltooide object te verkrijgen
}

// ConcreteBuilder - concrete implementatie van de bouwer
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
}

// Voorbeeld van gebruik
func main() {
	// Maak de bouwer voor hawaiiaanse pizza
	builder := NewHawaiianPizzaBuilder()

	// Bouw de pizza stap voor stap
	pizza := builder.
		SetDough("dun").
		SetSauce("tomaat").
		AddTopping("ananas").
		AddTopping("ham").
		Build() // Krijg de gereed pizza

	fmt.Printf("Gemaakte pizza: %+v\n", pizza)
}

Voordelen van het patroon:

  • Maakt het mogelijk om het bouwproces van een complex object te scheiden van de representatie.
  • Biedt een stapsgewijze constructie van het object.
  • Maakt het gemakkelijk om verschillende weergaven van hetzelfde object te creëren.
  • Zorgt dat de code voor het maken van het object beter leesbaar en onderhoudbaar is bij veel parameters.

Nadelen:

  • Verhoogt het aantal klassen in het project.
  • Kan overbodig zijn voor eenvoudige objecten.