Páginas

jueves, 6 de noviembre de 2014

Patrones de Diseño - Patrón Builder - ¿Que es el Patrón de Diseño Builder / Constructor ?

Hola ya casi terminando con los patrones creacionales, hoy vamos a ver el patrón Builder.


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

Patrones de Diseño - Patrón Builder - ¿Que es el Patrón de Diseño Builder / Constructor ?

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.

Patrones de Diseño - Patrón Builder - ¿Que es el Patrón de Diseño Builder / Constructor ?

Pizza
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;
 }
}

AbstractBuilder
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;
 }
 
}

PizzaFugazzetaBuilder
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...");  
 }
}

PizzaMuzarellaBuilder
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...");  
 }

}

ManagerBuilder
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();
 }
 
}

Pizzeria
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