Il Builder Pattern ha come scopo la costruzione di Oggetti complessi mediante l’uso di oggetti più semplici, utilizzando un approccio step-by-step. Rientrando nella tipologia di pattern Creazionali, fornisce uno dei migliori modi per creare gli oggetti.

Builder

DIAGRAMMA UML BUILDER

 

Builder

 

IMPLEMENTAZIONE BUILDER

Creiamo un’interfaccia Oggetto che rappresenta dei prodotti alimentari come ad esempio hamburger e bevande fredde e classi concrete che implementano l’interfaccia.

Dopo di che creiamo e un’interfaccia Imballaggio che rappresenta il confezionamento dei suddetti prodotti e classi concrete che la implementano, come ad esempio un Contenitore che racchiude l’hamburger o una Bottiglia che racchiude le bevande fredde.

Infine, creiamo la classe Pasto che avrà una Lista di Oggetti ed un PastoBuilder che avrà il compito di creare diversi tipi di Pasto combinando gli Oggetti.

Step 1: Creiamo le interfacce che rappresenteranno gli Oggetti e gli Imballaggi

Oggetto.java

public interface Oggetto {
    public String nome();
    public float prezzo();
    public Imballaggio imballaggio();
}

Imballaggio.java

public interface Imballaggio {
    public String imballa();
}

Step 2: Creiamo le classi concrete che implementano le interfacce

Contenitore.java

public class Contenitore implements Imballaggio {
    @Override
    public String imballa() {
        return "Contenitore";
    }
}

Bottiglia.java

public class Bottiglia implements Imballaggio {
    @Override
    public String imballa() {
        return "Bottiglia";
    }
}

Step 3: Creiamo le classi astratte che implementano l’interfaccia Oggetto

Hamburger.java

public abstract class Hamburger implements Oggetto {
    @Override
    public Imballaggio imballaggio() {
        return new Contenitore() {
        };
    }
    @Override
    public abstract float prezzo();
}

BevandaFredda.java

public abstract class BevandaFredda implements Oggetto {
    @Override
    public Imballaggio imballaggio() {
        return new Bottiglia();
    }
    @Override
    public abstract float prezzo();
}

Step 4: Creiamo le classi concrete che estendono Hamburger e BevandaFredda

HamburgerVegano.java

public class HamburgerVegano extends Hamburger {
    @Override
    public float prezzo() {
        return 8.0f;
    }
    @Override
    public String nome() {
        return "Hamburger Vegano";
    }
}

ChickenBurger.java

public class ChickenBurger extends Hamburger {
    @Override
    public float prezzo() {
        return 5.5f;
    }
    @Override
    public String nome() {
        return "Chicken Burger";
    }
}

CocaCola.java

public class CocaCola extends BevandaFredda {
    @Override
    public float prezzo() {
        return 3.0f;
    }
    @Override
    public String nome() {
        return "Coca Cola";
    }
}

PepsiCola.java

public class PepsiCola extends BevandaFredda {
    @Override
    public float prezzo() {
        return 2.5f;
    }
    @Override
    public String nome() {
        return "Pepsi Cola";
    }
}

Step 5: Creiamo la classe Pasto che utilizzerà gli Oggetti appena definiti

import java.util.ArrayList;
import java.util.List;

public class Pasto {
    private List oggetti = new ArrayList();

    public void addOggetto(Oggetto oggetto){
        oggetti.add(oggetto);
    }

    public float getCosto(){
        float costo = 0.0f;

        for (Oggetto item : oggetti) {
            costo += item.prezzo();
        }
        return costo;
    }

    public void visualizzaOggetti(){
        System.out.println("[PASTO]: visualizzaOggetti()::start");
        for (Oggetto oggetto : oggetti) {
            System.out.print("[PASTO]: Oggetto -> " + oggetto.nome());
            System.out.print(", [PASTO]: Imballaggio -> " + oggetto.imballaggio().imballa());
            System.out.println(", [PASTO]: Prezzo -> " + oggetto.prezzo());
        }
        System.out.println("[PASTO]: visualizzaOggetti()::end");
    }
}

Step 6: Creiamo il builder

public class PastoBuilder {

    public Pasto preparaPastoVegano (){
        System.out.println("[PASTOBUILDER]: preparaPastoVegano()::start");
        Pasto pasto = new Pasto();
        pasto.addOggetto(new HamburgerVegano());
        pasto.addOggetto(new CocaCola());
        System.out.println("[PASTOBUILDER]: preparaPastoVegano()::end");
        return pasto;
    }

    public Pasto preparaPastoNonVegano (){
        System.out.println("[PASTOBUILDER]: preparaPastoNonVegano()::start");
        Pasto pasto = new Pasto();
        pasto.addOggetto(new ChickenBurger());
        pasto.addOggetto(new PepsiCola());
        System.out.println("[PASTOBUILDER]: preparaPastoNonVegano()::end");
        return pasto;
    }
}

Step 7: Creiamo il main per testare il pattern

public class Main {
    public static void main(String[] args) {

        PastoBuilder pastoBuilder = new PastoBuilder();

        Pasto pastoVegano = pastoBuilder.preparaPastoVegano();
        System.out.println("[MAIN]: ### PASTO VEGANO ###");
        pastoVegano.visualizzaOggetti();
        System.out.println("[MAIN]: Costo Totale: " + pastoVegano.getCosto());

        Pasto pastoNonVegano = pastoBuilder.preparaPastoNonVegano();
        System.out.println("\n[MAIN]: ### PASTO NON VEGANO ###");
        pastoNonVegano.visualizzaOggetti();
        System.out.println("[MAIN]: Costo Totale: " + pastoNonVegano.getCosto());
    }
}

Step 8: Output

[PASTOBUILDER]: preparaPastoVegano()::start
[PASTOBUILDER]: preparaPastoVegano()::end
[MAIN]: ### PASTO VEGANO ###
[PASTO]: visualizzaOggetti()::start
[PASTO]: Oggetto -> Hamburger Vegano, [PASTO]: Imballaggio -> Contenitore, [PASTO]: Prezzo -> 8.0
[PASTO]: Oggetto -> Coca Cola, [PASTO]: Imballaggio -> Bottiglia, [PASTO]: Prezzo -> 3.0
[PASTO]: visualizzaOggetti()::end
[MAIN]: Costo Totale: 11.0
[PASTOBUILDER]: preparaPastoNonVegano()::start
[PASTOBUILDER]: preparaPastoNonVegano()::end

[MAIN]: ### PASTO NON VEGANO ###
[PASTO]: visualizzaOggetti()::start
[PASTO]: Oggetto -> Chicken Burger, [PASTO]: Imballaggio -> Contenitore, [PASTO]: Prezzo -> 5.5
[PASTO]: Oggetto -> Pepsi Cola, [PASTO]: Imballaggio -> Bottiglia, [PASTO]: Prezzo -> 2.5
[PASTO]: visualizzaOggetti()::end
[MAIN]: Costo Totale: 8.0

 

LINK UTILI