martes, 9 de febrero de 2010

Patrones de diseño: Builder

El patrón Builder o Constructor es otro de los patrones creacionales. Este patrón permite separar la construcción de un objeto complejo de su representación, de modo que el mismo proceso de construcción pueda crear diferentes representaciones de este objeto.

La siguiente imagen muestra el diagrama de clases de este patrón:

  • 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.
  • Producto: El objeto complejo bajo construcción.

A continuación se muestra un ejemplo de este patrón, extraído de la Wikipedia. En este ejemplo tenemos un cocina (Director) que produce pizzas (Producto) de con diferentes características (Concrete Builder):

/** "Product" */
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. */
public 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();
}
}

Hay quién confunde el patrón Builder con Factory, pero la diferencia es que, mientras el patrón Factory difiere la elección de la clase concreta de un objeto, el patrón Builder simplemente oculta la lógica de creación de un objeto complejo.

Referencias:
Patrón Builder en Wikipedia
Builder
Builder Pattern, Interfaces Fluidas– Patrones de diseño
Intro to Design Patterns: Builder Pattern
Creational Patterns - Builder Pattern
Design Pattern - Builder Pattern
Otros patrones de diseño


2 comentarios: