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