Builder design pattern

Il Builder, ovvero il “costruttore” (da non confondersi con il metodo), è uno dei principali design pattern formalizzati dalla gang of four e si occupa di separare la costruzione di un oggetto dalla sua rappresentazione, in modo che il processo di costruzione degli oggetti sia in grado di creare molteplici rappresentazioni dello stesso.

Lo scopo dell’applicazione del design pattern Builder, è principalmente quello di separare il processo di creazione di un oggetto complesso dal flusso applicativo del client. Seguendo questa logica, si realizza una doppia astrazione: da una parte si rende indipendente il flusso di creazione e controllo di un oggetto dal client, dall’altra, l’algoritmo per la creazione di un oggetto è indipendente dalle varie parti che lo costituiscono e da come esse vengono assemblate.

Il design pattern Builder si rende applicabile quando:

  • è necessario costruire un oggetto step by step
  • è auspicabile isolare il processo di creazione e rappresentazione di un oggetto
  • è necessario monitorare le fasi del processo di creazione

Queste sono le principali conseguenze dell’applicazioni del pattern:

  • Isolamento delle classi che costituiscono le parti (step): come già detto in precedenza, seguendo questo pattern, si isolano e si rendono indipendenti dall’algoritmo di creazione dell’oggetto, le classi deputate all’implementazione delle parti che lo costituiranno.
  • Separazione della logica di creazione degli oggetti dall’applicazione: è lo scopo principale del pattern.

Passando attraverso il Director, verrà richiamato il Builder, l’interfaccia deputata ad assemblare le varie parti dell’oggetto da creare la quale, a sua volta,  delegherà al ConcreteBuilder il lavoro vero e proprio, definendolo nei suoi aspetti e tenendone traccia. Il Product, l’oggetto finale che verrà costruito, conterrà al suo interno le classi che costituiscono le parti che lo compongono.

Builder - Schema classi

Builder - Fonte: Wikipedia

Implementazione


/* Fonte: Wikipedia */
/** "Prodotto" */
class Pizza
{
private String dough = "";
private String sauce = "";
private String topping = "";

public void setDough(String dough)
{ this.dough = dough; }
public void setSauce(String sauce)
{ this.sauce = sauce; }
public void setTopping(String topping)
{ this.topping = topping; }
}

/** "Abstract Builder" */
abstract class PizzaBuilder
{
protected Pizza pizza;

public Pizza getPizza()
{
return pizza;
}
public void createNewPizzaProduct()
{
pizza = new Pizza();
}

public abstract void buildDough();
public abstract void buildSauce();
public abstract void buildTopping();
}

/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder
{
public void buildDough()
{
pizza.setDough("cross");
}
public void buildSauce()
{
pizza.setSauce("mild");
}
public void buildTopping()
{
pizza.setTopping("ham+pineapple");
}
}

/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder
{
public void buildDough()
{
pizza.setDough("pan baked");
}
public void buildSauce()
{
pizza.setSauce("hot");
}
public void buildTopping()
{
pizza.setTopping("pepperoni+salami");
}
}

/** "Director" */
class Cook
{
private PizzaBuilder pizzaBuilder;

public void setPizzaBuilder(PizzaBuilder pb)
{
pizzaBuilder = pb;
}
public Pizza getPizza()
{
return pizzaBuilder.getPizza();
}

public void constructPizza()
{
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildTopping();
}
}

/** A given type of pizza being constructed. */
class BuilderExample
{
public static void main(String[] args)
{
Cook cook = new Cook();
PizzaBuilder hawaiianPizzaBuilder = new HawaiianPizzaBuilder();
PizzaBuilder spicyPizzaBuilder = new SpicyPizzaBuilder();

cook.setPizzaBuilder( hawaiianPizzaBuilder );
cook.constructPizza();

Pizza pizza = cook.getPizza();
}
}

Tags: , ,

Lascia un Commento

Connect with Facebook