Patrón de Diseño Builder

Builder

Introducción

Centraliza el proceso de creación de un objeto complejo en un único objeto.

Builder Structure

Builder: Interfaz abstracta para crear productos.
Concrete Builder: Implementación del Builder. Construye y reúne las partes necesarias para construir los productos
Director: Construye un objeto usando el patrón Builder
Product: El objeto complejo bajo construcción

Product
class Pizza {
    private String masa = "";
    private String salsa = "";
    private String relleno = "";
 
    public void setMasa(String masa){ 
        this.masa = masa;
    }

    public void setSalsa(String salsa){ 
        this.salsa = salsa; 
    }
    
    public void setRelleno(String relleno){
        this.relleno = relleno;
    }
}
Abstract Builder
abstract class PizzaBuilder {
    protected Pizza pizza;
 
    public Pizza getPizza() { 
        return pizza; 
    }

    public void crearNuevaPizza() {
        pizza = new Pizza();
    }
 
    public abstract void buildMasa();
    public abstract void buildSalsa();
    public abstract void buildRelleno();
}
ConcreteBuilder
class HawaiPizzaBuilder extends PizzaBuilder {
    public void buildMasa(){
        pizza.setMasa("suave"); 
    }

    public void buildSalsa(){ 
        pizza.setSalsa("dulce"); 
    }
    
    public void buildRelleno() {
        pizza.setRelleno("chorizo+alcachofas"); 
    }
}
Director
class Cocina {
    private PizzaBuilder pizzaBuilder;
 
    public void setPizzaBuilder(PizzaBuilder pb) { 
        pizzaBuilder = pb; 
    }

    public Pizza getPizza() { }
        return pizzaBuilder.getPizza(); 
    }
 
    public void construirPizza() {
       pizzaBuilder.crearNuevaPizza();
       pizzaBuilder.buildMasa();
       pizzaBuilder.buildSalsa();
       pizzaBuilder.buildRelleno();
    }
}
Un cliente pidiendo una pizza
class BuilderExample {
    public static void main(String[] args) {
        Cocina cocina = new Cocina();
        PizzaBuilder hawai_pizzabuilder = new HawaiPizzaBuilder();
        PizzaBuilder picante_pizzabuilder = new PicantePizzaBuilder();
 
        cocina.setPizzaBuilder( hawai_pizzabuilder );
        cocina.construirPizza();
 
        Pizza pizza = cocina.getPizza();
    }
}
2da opción para el abstract builder quizá más transparente para su uso

Dentro del crear se llaman los métodos build.
Es válido siempre y cuando no se necesite alterar el orden del llamado a los “build’s”

abstract class OtroPizzaBuilder {
    protected Pizza pizza;
 
    public Pizza getPizza() { return pizza; }
    public void crearNuevaPizza() { 
           pizza = new Pizza(); 
           buildMasa();
           buildSalsa();
           buildRelleno();
    }
 
    public abstract void buildMasa();
    public abstract void buildSalsa();
    public abstract void buildRelleno();
}
Director
class OtraCocina {
    private OtroPizzaBuilder pizzaBuilder;
 
    public void setPizzaBuilder(OtroPizzaBuilder pb) { pizzaBuilder = pb; }
    public Pizza getPizza() { return pizzaBuilder.getPizza(); }
 
    public void construirPizza() {
       pizzaBuilder.crearNuevaPizza();
       //notar que no se necesita llamar a cada build.
    }
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *