Patrón de diseño de constructor

El patrón Builder tiene como objetivo «Separar la construcción de un objeto complejo de su representación para que el mismo proceso de construcción pueda crear diferentes representaciones». Se utiliza para construir un objeto complejo paso a paso y el paso final devolverá el objeto. El proceso de construcción de un objeto debe ser genérico para que pueda usarse para crear diferentes representaciones del mismo objeto.
 

Diagrama UML del patrón de diseño del constructor

Fuente: Wikipedia
 

  • Producto: la clase de producto define el tipo de objeto complejo que generará el patrón constructor.
  • Constructor: esta clase base abstracta define todos los pasos que se deben seguir para crear correctamente un producto. Cada paso es generalmente abstracto ya que la funcionalidad real del constructor se lleva a cabo en las subclases concretas. El método GetProduct se utiliza para devolver el producto final. La clase de constructor a menudo se reemplaza con una interfaz simple.
  • ConcreteBuilder: puede haber cualquier número de clases de constructores concretos heredados de Builder. Estas clases contienen la funcionalidad para crear un producto complejo particular.
  • Director: la clase de director controla el algoritmo que genera el objeto del producto final. Se crea una instancia de un objeto director y se llama a su método Construct. El método incluye un parámetro para capturar el objeto constructor concreto específico que se utilizará para generar el producto. Luego, el director llama a los métodos del constructor concreto en el orden correcto para generar el objeto del producto. Al finalizar el proceso, se puede utilizar el método GetProduct del objeto constructor para devolver el producto.

Veamos un ejemplo de patrón de diseño de constructor: 
considere la construcción de una casa. El hogar es el producto final final (objeto) que se devolverá como resultado del proceso de construcción. Tendrá muchos pasos, como la construcción del sótano, la construcción de paredes, etc., la construcción del techo. Finalmente, se devuelve todo el objeto de origen. Aquí usando el mismo proceso puedes construir casas con diferentes propiedades.
 

Java

interface HousePlan
{
    public void setBasement(String basement);
 
    public void setStructure(String structure);
 
    public void setRoof(String roof);
 
    public void setInterior(String interior);
}
 
class House implements HousePlan
{
 
    private String basement;
    private String structure;
    private String roof;
    private String interior;
 
    public void setBasement(String basement)
    {
        this.basement = basement;
    }
 
    public void setStructure(String structure)
    {
        this.structure = structure;
    }
 
    public void setRoof(String roof)
    {
        this.roof = roof;
    }
 
    public void setInterior(String interior)
    {
        this.interior = interior;
    }
 
}
 
 
interface HouseBuilder
{
 
    public void buildBasement();
 
    public void buildStructure();
 
    public void buildRoof();
 
    public void buildInterior();
 
    public House getHouse();
}
 
class IglooHouseBuilder implements HouseBuilder
{
    private House house;
 
    public IglooHouseBuilder()
    {
        this.house = new House();
    }
 
    public void buildBasement()
    {
        house.setBasement("Ice Bars");
    }
 
    public void buildStructure()
    {
        house.setStructure("Ice Blocks");
    }
 
    public void buildInterior()
    {
        house.setInterior("Ice Carvings");
    }
 
    public void buildRoof()
    {
        house.setRoof("Ice Dome");
    }
 
    public House getHouse()
    {
        return this.house;
    }
}
 
class TipiHouseBuilder implements HouseBuilder
{
    private House house;
 
    public TipiHouseBuilder()
    {
        this.house = new House();
    }
 
    public void buildBasement()
    {
        house.setBasement("Wooden Poles");
    }
 
    public void buildStructure()
    {
        house.setStructure("Wood and Ice");
    }
 
    public void buildInterior()
    {
        house.setInterior("Fire Wood");
    }
 
    public void buildRoof()
    {
        house.setRoof("Wood, caribou and seal skins");
    }
 
    public House getHouse()
    {
        return this.house;
    }
 
}
 
class CivilEngineer
{
 
    private HouseBuilder houseBuilder;
 
    public CivilEngineer(HouseBuilder houseBuilder)
    {
        this.houseBuilder = houseBuilder;
    }
 
    public House getHouse()
    {
        return this.houseBuilder.getHouse();
    }
 
    public void constructHouse()
    {
        this.houseBuilder.buildBasement();
        this.houseBuilder.buildStructure();
        this.houseBuilder.buildRoof();
        this.houseBuilder.buildInterior();
    }
}
 
class Builder
{
    public static void main(String[] args)
    {
        HouseBuilder iglooBuilder = new IglooHouseBuilder();
        CivilEngineer engineer = new CivilEngineer(iglooBuilder);
 
        engineer.constructHouse();
 
        House house = engineer.getHouse();
 
        System.out.println("Builder constructed: "+ house);
    }
}

Producción : 
 

Builder constructed: House@6d06d69c

Ventajas del patrón de diseño del constructor

  • Los parámetros del constructor se reducen y se proporcionan en llamadas a métodos de fácil lectura.
  • El patrón de diseño del constructor también ayuda a minimizar la cantidad de parámetros en el constructor y, por lo tanto, no es necesario pasar nulo para los parámetros opcionales al constructor.
  • El objeto siempre se instancia en un estado completo.
  • Los objetos inmutables se pueden construir sin mucha lógica compleja en el proceso de construcción de objetos.

 Desventajas del patrón de diseño del constructor

  • El número de líneas de código aumenta al menos al doble en el patrón de construcción, pero el esfuerzo vale la pena en términos de flexibilidad de diseño y código mucho más legible.
  • Requiere crear un ConcreteBuilder separado para cada tipo diferente de Producto.

Lectura adicional: Método Builder en Python .
Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *