Sobes.tech
Middle

Cos'è il pattern di progettazione 'costruttore' (Builder)?

sobes.tech AI

Risposta dell'AI

Il pattern "Builder" (Costruttore) è un pattern creazionale destinato a creare oggetti complessi passo dopo passo. Separa il processo di costruzione di un oggetto complesso dalla sua rappresentazione, in modo che lo stesso processo di costruzione possa creare diverse rappresentazioni.

Principi di funzionamento:

  1. Separazione: Separa la logica di creazione dell'oggetto dall'oggetto stesso.
  2. Delegazione: Il codice client (Director) delega la creazione dell'oggetto a una classe separata (Builder).
  3. Costruzione passo dopo passo: L'oggetto viene assemblato da componenti tramite un insieme di metodi del builder.

Principali partecipanti:

  • Product: Oggetto complesso che vogliamo costruire. Non dipende dal processo di creazione.
  • Builder: Interfaccia astratta che definisce i passi per costruire il Product.
  • ConcreteBuilder: Implementazione concreta di Builder, che realizza i passi di costruzione e fornisce un metodo per ottenere il Product finito.
  • Director (Opzionale): Definisce l'ordine di chiamata dei passi di costruzione. Non è obbligatorio, il codice cliente può interagire direttamente con ConcreteBuilder.

Vantaggi:

  • Permette di creare oggetti con molti parametri opzionali in modo più leggibile rispetto a costruttori con molti argomenti o catene di setter.
  • Permette di creare diverse variazioni di un stesso oggetto usando lo stesso processo di costruzione.
  • Nasconde la struttura interna dell'oggetto creato.

Svantaggi:

  • Potrebbe aumentare il numero di classi nel progetto (Builder, ConcreteBuilder, Product, Director).

Esempio di utilizzo: Creazione di un oggetto della classe Pizza con diversi ingredienti.

// Product
public class Pizza {
    private String dough;
    private String sauce;
    private String cheese;
    private List<String> toppings;

    public void setDough(String dough) { this.dough = dough; }
    public void setSauce(String sauce) { this.sauce = sauce; }
    public void setCheese(String cheese) { this.cheese = cheese; }
    public void setToppings(List<String> toppings) { this.toppings = toppings; }

    @Override
    public String toString() {
        return "Pizza con impasto=" + dough + ", salsa=" + sauce + ", formaggio=" + cheese + ", condimenti=" + toppings;
    }
}
// Builder
public interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getPizza();
}
// ConcreteBuilder
public class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

    public MargheritaPizzaBuilder() {
        this.pizza = new Pizza();
        this.pizza.setToppings(new ArrayList<>()); // Inizializza la lista
    }

    @Override
    public void buildDough() {
        pizza.setDough("Impasto sottile");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Salsa di pomodoro");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // La Margherita non aggiunge topping oltre a quelli di base
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}
// Director (Opzionale)
public class Kitchen {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public Pizza getPizza() {
        return pizzaBuilder.getPizza();
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // Possono essere chiamati altri metodi, ad esempio addTopping() in un altro builder
    }
}

Utilizzo:

// Codice cliente
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();

kitchen.setPizzaBuilder(margheritaBuilder);

kitchen.constructPizza();

Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Output: Pizza con impasto=Impasto sottile, salsa=Salsa di pomodoro, formaggio=Mozzarella, condimenti=[]