You are on page 1of 23

UNIVERSIDAD NACIONAL DE TRUJILLO

PATRONES DE DISEO
BUILDER

PATRON DE DISEO
BUILDER
Patrones creacionales de diseo.
Permite separar la construccin de un objeto
complejo de su representacin.
Se usa para evitar situaciones de
acoplamiento

CARACTERISTICAS:

Valores por OMISIN


No contiene atributos con el modificador
final
El orden en que se ejecutan los mtodos
NO ES DETERMINANTE
Ser un concepto PROBADO
La solucin NO ES OBVIA
Describe participantes y RELACIONES
entre ellos
El patrn tiene un COMPONENTE
HUMANO significativa

COMPONENTES DEL PATRON DE DISEO BUILDER :

Builder: Interfaz abstracta para crear productos.

Concrete Builder:

_ Implementacin del Builder


_ Construye y rene las partes necesarias para construir los productos

Director: Construye un objeto usando el patrn Builder

Product: Representa al objeto complejo en construccin.

EJEMPLO:
Fbrica de vehculos

Pasos y Aplicabilidad:
Problema al que ataca:
El incremento de clases y objetos usados.
Objetos complejos hechos de partes producidas por otros objetos
que necesitan especial cuidado cuando se empiezan a construir.
Necesidad de un mecanismo para producir objetos complejos que
sean independientes unos de otros cuando se crea el objeto.
No se protegen los detalles de los objetos de presentacin con
respecto a la lgica de creacin.

Construccin y representacin de un objeto complejo estn


unidas.

Este patrn es til en alguno de los siguientes supuestos:

Cuando el algoritmo para crear un objeto complejo puede independizarse de


las partes que componen el objeto y de cmo son ensambladas.
Cuando el proceso de construccin debe permitir distintas representaciones
para el objeto que se construye.
Cuando el objeto a construir es complejo y sus distintas configuraciones son
limitadas. En caso de que necesitemos un objeto complejo pero cada una de

sus partes deba ser configurado de forma individual (en el ejemplo que nos
ocupa, se tratara de definir cada elemento al gusto del consumidor en lugar
de objetos predefinidos), este patrn no ser una buena idea, ya que ser
necesario realizar el proceso de asignacin de cada elemento paso a paso.

El algoritmo para creacin de un objeto complejo debe ser independiente de


las partes que conforman el objeto y cmo estn ensambladas.
El proceso de construccin debe permitir diferentes representaciones del
objeto que se construye.

Pasos:
Al final los pasos para la correcta utilizacin del patrn son los
siguientes:
El Cliente crea un objeto Director y lo configura con el objeto
Builder.
El Director notifica al constructor cuando una parte del Producto
se debe construir.
El Builder maneja las peticiones del Director y agrega las partes
al Producto.
El Cliente el producto del Builder.

I. Consecuencias:

Se nos permite variar la representacin interna del Producto: como el


producto se construye a travs de una interfaz abstracta, para cambiar la
representacin interna del producto basta con definir un nuevo tipo de
constructor.

Se nos permite separar el cdigo de la construccin y la representacin.

Permite variar la representacin interna de un producto.

Permite separar el cdigo de la construccin y la representacin.

Da control refinado sobre el proceso de construccin.

VENTAJAS E INCONVENIENTES
El patrn Builder facilita la gestin del flujo de control durante la
creacin de objetos complejos. Esto se manifiesta de dos formas:
Para objetos que necesitan una creacin en fases (una secuencia
de pasos para lograr que le objetivo se active), el objeto Builder
acta como un objeto de alto nivel que supervisa el proceso.
Puede coordinar y validar la creacin de todos los recursos y, si
fuera necesario proporcionar una estrategia de emergencia en
caso de que ocurra un error.
Para objetos que durante la creacin necesitan recursos existente
en el sistema, como conexiones a la base de datos u objetos de
negocio existentes, el objeto Builder proporciona un punto de
acceso centralizado para gestionar esos recursos. Builder tambin
proporciona un nico punto de control de creacin para sus
productos, que puede ser utilizado por otros objetos del sistema. al
igual que otros patrones de creacin, esto facilita las cosas para
los clientes de sistema de software, porque solo necesitan acceder
al objeto Builder para obtener un recurso.

El principal inconveniente de este patrn es


que hay un alto grado de acoplamiento entre el
objeto Builder, su producto y cualquier otro
delegado para la creacin utilizado durante la
construccin de objetos. Los cambios que
sucedan en el producto creado por el Builder a
menudo generan modificaciones tanto para el
objeto Builder como para sus delegados.

IMPLEMENTACIN:
Ejemplo:Una pizzera la cual la
describiremos de la siguiente manera
Una cocina: Director
Las pizzas: Product
Las diferentes variedades de pizzas:
ConcreteBuilder
Ahora implementaremos el cdigo :

class Pizza {
private String base;
private String salsa;
private String ingredientes;
//Aca implementamos los mtodos set y get es decir
los mtodos de lectura y retorno para cada
// atributo
Public Void setBase(String base){this.base = base}
Public Void setSalsa(String salsa){this.salsa = salsa}
Public Void setIngredientes(String
ingredients){this.ingredientes=ingredientes}
Public String getBase(){return base}
Public String getSalsa(){return salsa}
Public String getIngredientes(){return ingredientes}

Luego implementaremos el patrn Builder de la


siguiente manera :
abstract class PizzaBuilder {
protected Pizza pizza;
public Pizza getPizza() {
return this.pizza;
}
public void createPizzaProduct() {
this.pizza = new Pizza();
}

public abstract void hacerBase();


public abstract void hacerSalsa();
public abstract void hacerIngredientes();

Luego implementaremos las clases Concrete Builder en la cual


especificaremos obiamente las clases de pizza que produciremos
:
En este caso : barbacoa , carbonara , mediterrnea ;
class Carbonara extens PizzaBuilder {
public void hacerBase() {
this.pizza.setBase(FINA);
}
public void hacerSalsa() {
this.pizza.setSalsa(NATA);
}

public void hacerIngredientes() {


this.pizza.setIngredientes(BACON + CEBOLLA);
}

class Barbacoa extens PizzaBuilder {


public void hacerBase() {
this.pizza.setBase(GRUESA);
}
public void hacerSalsa() {
this.pizza.setSalsa(TOMATE);
}

public void hacerIngredientes() {


this.pizza.setIngredientes(CARNE + CARNE);
}

class Mediterranea extens PizzaBuilder {


public void hacerBase() {
this.pizza.setBase(EXTRA_FINA);
}
public void hacerSalsa() {
this.pizza.setSalsa(NO);
}

public void hacerIngredientes() {


this.pizza.setIngredientes(ACEITUNA + ALCACHOFA);
}

Y por ultimo representaremos a la clase director en la cual se


armara la pizza poras decirlo:
class Cook {
private PizzaBuilder pizzaBuilder;

public void setPizzaBuilder(PizzaBuilder pb) {


this.pizzaBuilder = pb;
}
public Pizza getPizza() {
return this.pizzaBuilder.getPizza();
}
public void hacerPizza() {
pizzaBuilder.createPizzaProduct();
pizzaBuilder.hacerBase();
pizzaBuilder.hacerSalsa();
pizzaBuilder.hacerIngredientes();
}
}

Ahora solo nos faltaria el codigo del main o el


principal , es decir donde ejecutaremos y veremos
que todo funcin correctamente
public class Main {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder carbonaraB = new Carbonara();
cook.setPizzaBuilder(carbonaraB);
cook.hacerPizza();

Pizza pizza = cook.getPizza();

GRACIAS