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.