Middle
Parla del pattern di progettazione Builder (Costruttore).
sobes.tech AI
Risposta dell'AI
Builder è un pattern creazionale che permette di creare oggetti complessi passo dopo passo.
Viene applicato quando:
- Il processo di creazione dell'oggetto è complesso e coinvolge molte fasi.
- È necessario creare diverse rappresentazioni dello stesso oggetto.
- Il costruttore dell'oggetto ha molti parametri opzionali.
Il pattern consiste nei seguenti ruoli:
- Builder: Interfaccia che definisce i passi per costruire l'oggetto.
- ConcreteBuilder: Implementazione concreta di Builder che esegue i passi di costruzione e fornisce il metodo per ottenere l'oggetto finito.
- Product: L'oggetto complesso che viene costruito.
- Director (opzionale): Definisce l'ordine di chiamata dei passi di costruzione.
Esempio di implementazione in Golang senza Director:
// Product - oggetto che stiamo costruendo
type Pizza struct {
Dough string
Sauce string
Toppings []string
}
// Builder - interfaccia del costruttore
type PizzaBuilder interface {
SetDough(dough string) PizzaBuilder
SetSauce(sauce string) PizzaBuilder
AddTopping(topping string) PizzaBuilder
Build() Pizza // Metodo per ottenere l'oggetto finito
}
// ConcreteBuilder - implementazione concreta del costruttore
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
}
// Esempio di utilizzo
func main() {
// Creiamo il builder per la pizza hawaiana
builder := NewHawaiianPizzaBuilder()
// Costruiamo la pizza passo dopo passo
pizza := builder.
SetDough(" sottile").
SetSauce("pomodoro").
AddTopping("ananas").
AddTopping("prosciutto").
Build() // Otteniamo la pizza pronta
fmt.Printf("Pizza creata: %+v\n", pizza)
}
Vantaggi del pattern:
- Permette di isolare il processo di costruzione di un oggetto complesso dalla sua rappresentazione.
- Fornisce una costruzione passo a passo dell'oggetto.
- Facilita la creazione di diverse rappresentazioni dello stesso oggetto.
- Rende il codice di creazione dell'oggetto più leggibile e manutenibile quando ci sono molti parametri.
Svantaggi:
- Aumenta il numero di classi nel progetto.
- Potrebbe essere eccessivo per oggetti semplici.