Sobes.tech
Middle

Cos'è un Builder nel contesto della progettazione del software?

sobes.tech AI

Risposta dell'AI

Questo è un pattern di progettazione creazionale che separa la costruzione di un oggetto complesso dalla sua rappresentazione, consentendo di creare diverse rappresentazioni dell'oggetto utilizzando lo stesso processo di costruzione.

Principio di funzionamento:

  • Prodotto (Product): Oggetto complesso da costruire.
  • Costruttore (Builder): Interfaccia astratta per creare parti del prodotto.
  • Costruttore Concreto (Concrete Builder): Implementazione dell'interfaccia "Builder" che crea parti specifiche del prodotto e le assembla in un prodotto finale.
  • Direttore (opzionale): Definisce la sequenza di passaggi per la costruzione e utilizza il Costruttore per creare il prodotto.

Vantaggi:

  • Permette di costruire oggetti complessi passo dopo passo.
  • Separa la logica di costruzione dall'oggetto stesso.
  • Permette di creare diverse rappresentazioni dell'oggetto con lo stesso processo.
  • Facilita l'estensione aggiungendo nuovi Costruttori Concreti.

Svantaggi:

  • Aumenta il numero di classi a causa della necessità di creare diversi Costruttori Concreti.
  • Può complicare il codice per oggetti semplici.

Esempio di utilizzo (Java):

Immaginiamo la creazione di un oggetto complesso "Casa":

// Prodotto
class House {
    private String walls;
    private String roof;
    private String windows;
    private String doors;

    public void setWalls(String walls) { this.walls = walls; }
    public void setRoof(String roof) { this.roof = roof; }
    public void setWindows(String windows) { this.windows = windows; }
    public void setDoors(String doors) { this.doors = doors; }

    @Override
    public String toString() {
        return "House{" +
               "walls='" + walls + '\'' +
               ", roof='" + roof + '\'' +
               ", windows='" + windows + '\'' +
               ", doors='" + doors + '\'' +
               '}';
    }
}

// Costruttore
interface HouseBuilder {
    void buildWalls();
    void buildRoof();
    void buildWindows();
    void buildDoors();
    House getResult();
}

// Costruttore Concreto
class StoneHouseBuilder implements HouseBuilder {
    private House house;

    public StoneHouseBuilder() {
        this.house = new House();
    }

    @Override
    public void buildWalls() {
        house.setWalls("Muri di pietra");
    }

    @Override
    public void buildRoof() {
        house.setRoof("Tetto di tegole");
    }

    @Override
    public void buildWindows() {
        house.setWindows("Finestre di legno");
    }

    @Override
    public void buildDoors() {
        house.setDoors("Porta di legno massiccio");
    }

    @Override
    public House getResult() {
        return house;
    }
}

// Direttore (opzionale)
class Director {
    public void constructStoneHouse(HouseBuilder builder) {
        builder.buildWalls();
        builder.buildRoof();
        builder.buildWindows();
        builder.buildDoors();
    }
}

// Utilizzo
public class BuilderExample {
    public static void main(String[] args) {
        Director director = new Director();
        HouseBuilder stoneHouseBuilder = new StoneHouseBuilder();

        director.constructStoneHouse(stoneHouseBuilder);

        House stoneHouse = stoneHouseBuilder.getResult();
        System.out.println(stoneHouse); // Output: House{walls='Muri di pietra', roof='Tetto di tegole', windows='Finestre di legno', doors='Porta di legno massiccio'}
    }
}