Patrón de Diseño Constructor
El patrón Constructor (Builder Pattern) se utiliza para construir un objeto complejo paso a paso utilizando múltiples objetos simples. Este patrón pertenece a la categoría de patrones de creación, proporcionando una forma óptima de crear objetos.
Un clase Constructor construye el objeto final paso a paso y es independiente de otros objetos.
Introducción Propósito: Separar la construcción de un objeto complejo de su representación, permitiendo que el mismo proceso de construcción pueda crear diferentes representaciones.
Problema principal: En los sistemas de software, a menudo se enfrenta a la creación de "un objeto complejo" compuesto por subobjetos con ciertos algoritmos. Debido a los cambios en los requisitos, las partes del objeto complejo pueden cambiar frecuentemente, pero el algoritmo que las combina suele ser más estable.
Cuándo usar: Cuando las partes básicas no cambian, pero sus combinaciones sí.
Cómo resolver: Separar lo que cambia de lo que no cambia.
Código clave: Constructor: crea y proporciona instancias, Director: gestiona las dependencias de las instancias construidas.
Ejemplos de aplicación: 1. En KFC, los ingredientes como hamburguesas, refrescos, papas fritas y alas de pollo son constentes, pero sus combinaciones varían, formando "combos". 2. StringBuilder en Java.
Ventajas: 1. El constructor es independiente y fácil de extender. 2. Facilita el control de riesgos detallados.
Desventajas: 1. Los productos deben tener puntos en común, limitando su rango. 2. Si los cambios internos son complejos, puede haber muchos constructores.
Escenarios de uso: 1. Cuando el objeto a generar tiene una estructura interna compleja. 2. Cuando las propiedades internas del objeto son interdependientes.
Consideraciones: La diferencia con el patrón Factory es que el patrón Constructor se enfoca más en el orden de ensamblaje de las piezas.
Roles en el Patrón Constructor
-
Producto (Product): Un objeto producto concreto
- Constructor (Builder): Una interfaz o clase abstracta que especifica los métodos para crear las partes del objeto.
- ConstructorConcreto (ConcreteBuilder): Implementa la interfaz y asamblea las partes.
- Director: Gestiona la construcción del objeto usando el Constructor. Su principal función es aislar al cliente del proceso de producción y controlar la creación del producto.
Ejemplo: Construcción de una casa, incluyendo cimentación, muros y techo. El proceso de construcción es el mismo, pero la implementación varía.
- Producto: Casa
package com.disenio.demo.constructor.mejorado;
public class Casa {
private String cimiento;
private String muros;
private String techo;
public String getCimiento() {
return cimiento;
}
public void setCimiento(String cimiento) {
this.cimiento = cimiento;
}
public String getMuros() {
return muros;
}
public void setMuros(String muros) {
this.muros = muros;
}
public String getTecho() {
return techo;
}
public void setTecho(String techo) {
this.techo = techo;
}
}
2. Constructor, Builder
package com.disenio.demo.constructor.mejorado;
public abstract class ConstructorCasa {
protected Casa casa = new Casa();
public abstract void construirCimiento();
public abstract void construirMuros();
public abstract void construirTecho();
public Casa construirCasa() {
return casa;
}
}
3. Implementaciones de ConstructorCasa: CasaComun y EdificioAlto
package com.disenio.demo.constructor.mejorado;
public class CasaComun extends ConstructorCasa {
@Override
public void construirCimiento() {
System.out.println("Cimiento de casa común: 5 metros");
}
@Override
public void construirMuros() {
System.out.println("Muros de casa común: 10 cm");
}
@Override
public void construirTecho() {
System.out.println("Techo de casa común");
}
}
package com.disenio.demo.constructor.mejorado;
public class EdificioAlto extends ConstructorCasa {
@Override
public void construirCimiento() {
System.out.println("Cimiento de edificio alto: 100 metros");
}
@Override
public void construirMuros() {
System.out.println("Muros de edificio alto: 1 metro");
}
@Override
public void construirTecho() {
System.out.println("Techo de edificio alto: transparente");
}
}
4. Director: DirectorCasa, para construir el Constructor concreto y controlar el proceso de producción
package com.disenio.demo.constructor.mejorado;
public class DirectorCasa {
private ConstructorCasa constructorCasa = null;
public DirectorCasa(ConstructorCasa constructorCasa) {
this.constructorCasa = constructorCasa;
}
public void setConstructorCasa(ConstructorCasa constructorCasa) {
this.constructorCasa = constructorCasa;
}
public Casa construirCasa() {
constructorCasa.construirCimiento();
constructorCasa.construirMuros();
constructorCasa.construirTecho();
return constructorCasa.construirCasa();
}
}
5. Prueba del Cliente
package com.disenio.demo.constructor.mejorado;
public class Cliente {
public static void main(String[] args) {
CasaComun casaComun = new CasaComun();
DirectorCasa directorCasa = new DirectorCasa(casaComun);
Casa casa = directorCasa.construirCasa();
System.out.println("*********************");
EdificioAlto edificioAlto = new EdificioAlto();
DirectorCasa director = new DirectorCasa(edificioAlto);
Casa casa1 = director.construirCasa();
}
}
Cimiento de casa común: 5 metros
Muros de casa común: 10 cm
Techo de casa común
*********************
Cimiento de edificio alto: 100 metros
Muros de edificio alto: 1 metro
Techo de edificio alto: transparente
Process finished with exit code 0