Patrón Builder
El patrón Builder separa la construcción de un objeto complejo de su representación, permitiendo que el mismo proceso cree diferentes representaciones. Úsalo cuando construir un objeto requiere muchos pasos o configuraciones que varían de forma independiente.
Resumen
El patrón Builder descompone la construcción de un objeto complejo en pasos discretos, expuestos por un objeto builder. El cliente invoca los pasos que le interesan en el orden que quiera y luego le pide al builder el resultado final. Brilla cuando un constructor tendría que recibir una docena de parámetros, la mitad opcionales.
Cuándo usarlo
- Un objeto tiene muchos campos opcionales o pasos de configuración y la sobrecarga de constructores explota.
- Quieres que el mismo proceso de construcción produzca diferentes representaciones (ej. una query que renderiza como SQL o como objeto parametrizado).
- Quieres que la construcción sea fluida y autoexplicativa en el sitio de llamada.
Ejemplo
class Pizza {
size: string = "M";
cheese = false;
pepperoni = false;
mushrooms = false;
}
class PizzaBuilder {
private pizza = new Pizza();
size(size: string) { this.pizza.size = size; return this; }
addCheese() { this.pizza.cheese = true; return this; }
addPepperoni() { this.pizza.pepperoni = true; return this; }
addMushrooms() { this.pizza.mushrooms = true; return this; }
build(): Pizza { return this.pizza; }
}
const pizza = new PizzaBuilder()
.size("L")
.addCheese()
.addMushrooms()
.build();Ventajas
- Construye objetos complejos paso a paso sin constructores telescópicos.
- La API fluida hace que la intención sea obvia en el sitio de llamada.
- El mismo protocolo de builder puede producir diferentes resultados concretos (director + builder).
Desventajas
- Más código que un constructor simple — esfuerzo desperdiciado si el objeto es pequeño.
- El estado mutable del builder puede filtrarse si reutilizas la misma instancia.
- La validación tiene que vivir en `build()` en lugar de en el constructor.