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.
DIAGRAMMA UML 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
0 Comments