# Propósito
El Builder separa la construcción de un objeto complejo de su representación, de forma que el mismo proceso de construcción pueda crear diferentes representaciones.
# Problema
La necesidad de crear un objeto complejo de manera flexible y controlada, evitando tener un constructor con una larga lista de parámetros, lo cual no es nada práctico.
# Solución
La solución que propone el Builder es:
-
Encapsular la construcción del objeto: Separar la construcción de su representación. Esto permite que un mismo proceso de construcción cree diferentes representaciones del objeto.
-
Construcción paso a paso: El objeto se construye paso a paso bajo el control del “director“, que asegura una correcta construcción.
# Estructura
# Participantes
-
Builder: Interfaz que declara los métodos para crear las partes de un objeto producto (Product).
-
ConcreteBuilder: Implementa la interfaz Builder para construir y ensamblar las partes del producto. Define la representación a crear y retorna el producto.
-
Director: Construye un objeto usando la interfaz Builder en una serie de pasos.
-
Product: Representa el objeto complejo a construir.
# Cuándo Usarlo
Este patrón es recomendable cuando el proceso de construcción:
-
Debe ser independiente de las partes que componen el objeto.
-
Debe permitir diferentes representaciones del objeto que está siendo construido.
# Ventajas
-
verified
Mayor control
Permite una construcción paso a paso, lo que da un control más fino.
-
verified
Encapsulamiento y Claridad
Encapsula el código de construcción en un solo lugar.
-
verified
Reutilización
El objeto constructor puede ser reutilizado para crear distintas variantes.
# Desventajas
-
warning
Complejidad Adicional
Introduce más clases y objetos (director, builder, builderconcreto).
-
warning
Constructor Separado
Para cada tipo diferente de objeto es necesario un constructor diferente.
# Ejemplo: Sistema para armar computadoras
Estamos construyendo un sistema para configurar computadoras personalizadas. Las computadoras pueden tener diferentes componentes (CPU, GPU, memoria, etc.), y queremos permitir al cliente elegir estas partes.
Problema
Los clientes deben poder crear una computadora a partir de la configuración de cada una de sus partes.
Solución planteada
Implementamos un Builder que permite crear un objeto complejo (la computadora) a partir de la construcción de cada una de sus partes.
La interfaz ComputerBuilder define los pasos para ensamblar diferentes componentes de una computadora (CPU, GPU, memoria). GamingComputerBuilder es una implementación específica que ensambla una computadora gamer siguiendo esos pasos. Computer es la computadora ensamblada final, con los componentes seleccionados. ComputerShop actúa como el director, que guía el ensamblaje de la computadora mediante un ComputerBuilder.
# Código Java
Codificamos en Java lo que preparamos en el diagrama. Definimos el Producto:
class Computer {
private String cpu;
private String gpu;
private String memory;
public String getCpu() { return cpu; }
public void setCpu(String cpu) { this.cpu = cpu; }
public String getGpu() { return gpu; }
public void setGpu(String gpu) { this.gpu = gpu; }
public String getMemory() { return memory; }
public void setMemory(String memory) { this.memory = memory; }
}
Definimos la interfaz de construcción:
interface ComputerBuilder {
void buildCPU();
void buildGPU();
void buildMemory();
Computer getComputer();
}
Implementamos un constructor concreto para computadoras gamer:
class GamingComputerBuilder implements ComputerBuilder {
private Computer computer = new Computer();
public void buildCPU() { computer.setCpu("High-end CPU"); }
public void buildGPU() { computer.setGpu("High-end GPU"); }
public void buildMemory() { computer.setMemory("64GB RAM"); }
public Computer getComputer() { return computer; }
}
Creamos el director, que utiliza el builder para construir la computadora:
class ComputerShop {
public Computer constructComputer(ComputerBuilder builder) {
builder.buildCPU();
builder.buildGPU();
builder.buildMemory();
return builder.getComputer();
}
}
# Mapeo Participantes
-
ComputerBuilder(Builder): Interfaz que declara los métodos para construir partes del producto.
-
GamingComputerBuilder (ConcreteBuilder): Implementa la interfaz Builder; guarda y devuelve el producto final.
-
Computer (Product): El objeto complejo a construir.
-
ComputerShop (Director): Define el orden en que se construirán las partes.
# Conclusiones
Este ejemplo pudimos ver el uso del patrón Builder ensamblando computadoras con distintas especificaciones, de manera estructurada y flexible. Cada componente se selecciona y se ensambla paso a paso, facilitando la personalización para el cliente.
# Patrones relacionados
Factory Method
Las clases ConcreteBuilder suelen implementarse con métodos de fabricación.
Abstract Factory
Ambos construyen objetos complejos. Builder lo retorna como paso final; Abstract lo devuelve de inmediato.
Composite
Muchas veces lo que construye el Builder es un Composite.