Patrones de Diseño - ¿Que es el Patrón de Diseño Builder / Constructor ?
Separar la construcción de un objeto complejo de su representación, de modo que el mismo proceso de construcción pueda crear representaciones diferentes.
Diagrama UML
AbstractBuilder: Posee los métodos que pueden realizar un builder y tambien una propiedad con el objeto a crear.
ProductoBase: Es el objeto base a crear.
EspecificOneBuilder/EspecificTwoBuilder: Constructor que posee los métodos implementados.
ManangerBuilder: Ejecuta los métodos del builder a fin de constuir un objeto puntual., el builder es pasado por parámetro.
Nombre del patrón:
Patrón Builder / Constructor
Clasificación del Patrón:
Creacional
Intención:
Abstrae el proceso de creación de un objeto complejo, centralizando dicho proceso en un único punto, de tal forma que el mismo proceso de construcción pueda crear representaciones diferentes.
Ejemplo:
Ejemplo sacado del GoF - Problema: Pizzeria.
Pizza
AbstractBuilder
PizzaFugazzetaBuilder
PizzaMuzarellaBuilder
ManagerBuilder
Pizzeria
package ar.com.patronesdisenio.builder.producto; public class Pizza { private String ingredientes; public String getIngredientes() { return ingredientes; } public void setIngredientes(String ingredientes) { this.ingredientes = ingredientes; } @Override public String toString() { return "Ingredientes: " + ingredientes; } }
package ar.com.patronesdisenio.builder; import ar.com.patronesdisenio.builder.producto.Pizza; public abstract class AbstractBuilder { private Pizza pizza; public AbstractBuilder(){ this.pizza = new Pizza(); } public abstract void juntarIngredientes(); public abstract void amazar(); public abstract void cocinar(); public Pizza getPizza() { return pizza; } public void setPizza(Pizza pizza) { this.pizza = pizza; } }
package ar.com.patronesdisenio.builder.builders; import ar.com.patronesdisenio.builder.AbstractBuilder; public class PizzaFugazzetaBuilder extends AbstractBuilder{ @Override public void juntarIngredientes() { this.getPizza().setIngredientes("Cebolla"); } @Override public void amazar() { System.out.println("Amazando..."); } @Override public void cocinar() { System.out.println("Cocinando..."); } }
package ar.com.patronesdisenio.builder.builders; import ar.com.patronesdisenio.builder.AbstractBuilder; public class PizzaMuzarellaBuilder extends AbstractBuilder{ @Override public void juntarIngredientes() { this.getPizza().setIngredientes("Tomate"); } @Override public void amazar() { System.out.println("Amazando..."); } @Override public void cocinar() { System.out.println("Cocinando..."); } }
package ar.com.patronesdisenio.builder.manager;
import ar.com.patronesdisenio.builder.AbstractBuilder;
import ar.com.patronesdisenio.builder.producto.Pizza;
public class ManagerBuilder {
private AbstractBuilder ab;
public ManagerBuilder (AbstractBuilder ab){
this.ab = ab;
}
public Pizza hacerPizza(){
this.ab.juntarIngredientes();
this.ab.amazar();
this.ab.cocinar();
return ab.getPizza();
}
}
package ar.com.patronesdisenio.builder.exec;
import ar.com.patronesdisenio.builder.builders.PizzaMuzarellaBuilder;
import ar.com.patronesdisenio.builder.manager.ManagerBuilder;
import ar.com.patronesdisenio.builder.producto.Pizza;
public class Pizzeria {
/**
* @param args
*/
public static void main(String[] args) {
ManagerBuilder mb = new ManagerBuilder(new PizzaMuzarellaBuilder());
Pizza pizza = mb.hacerPizza();
System.out.println(pizza.toString());
}
}


No hay comentarios:
Publicar un comentario