Patrón de Diseño Constructor

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.

  1. 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

Etiquetas: Builder Pattern design patterns java Object Creation Software Engineering

Publicado el 10-20 16:08