Patrón Builder
🧱 El arquitecto de castillos
Imagina que eres un arquitecto real en un reino de fantasía.
Tu misión: construir castillos para diferentes reyes 🏰.
Cada uno tiene sus exigencias:
- Uno quiere un castillo de piedra con torres imponentes.
- Otro, un palacio de cristal con jardines flotantes.
- Y un tercero, una fortaleza en el volcán con murallas de obsidiana 🔥.
El truco está en no cambiar los planos, sino cambiar cómo se construye.
Ahí entra el Patrón Builder: separa el proceso de construcción de la representación final.
El mismo arquitecto puede usar distintos “Constructores” (obreros especializados) para levantar diferentes tipos de edificaciones.
👷 Ejemplo en código (simplificado)
🔹 La construcción
class Construccion {
public array $partes = [];
public function mostrar(): void {
echo "Construcción: " . implode(', ', $this->partes) . "\n";
}
}🔹 La interfaz del Builder
interface Builder {
public function construirCimientos(): void;
public function construirEstructura(): void;
public function construirTecho(): void;
public function obtenerResultado(): Construccion;
}🏰 Builder concreto: Castillo
class BuilderCastillo implements Builder {
private Construccion $construccion;
public function __construct() {
$this->construccion = new Construccion();
}
public function construirCimientos(): void {
$this->construccion->partes[] = "Cimientos de piedra";
}
public function construirEstructura(): void {
$this->construccion->partes[] = "Muros con torres";
}
public function construirTecho(): void {
$this->construccion->partes[] = "Techo de almenas";
}
public function obtenerResultado(): Construccion {
return $this->construccion;
}
}
🏡 Otro Builder: Cabaña
class BuilderCabana implements Builder {
private Construccion $construccion;
public function __construct() {
$this->construccion = new Construccion();
}
public function construirCimientos(): void {
$this->construccion->partes[] = "Cimientos de madera";
}
public function construirEstructura(): void {
$this->construccion->partes[] = "Paredes de troncos";
}
public function construirTecho(): void {
$this->construccion->partes[] = "Techo de paja";
}
public function obtenerResultado(): Construccion {
return $this->construccion;
}
}🧠El arquitecto
class Arquitecto {
public function construir(Builder $builder): Construccion {
$builder->construirCimientos();
$builder->construirEstructura();
$builder->construirTecho();
return $builder->obtenerResultado();
}
}🧩 Uso
$arquitecto = new Arquitecto();
$castillo = $arquitecto->construir(new BuilderCastillo());
$castillo->mostrar(); // Construcción: Cimientos de piedra, Muros con torres, Techo de almenas
$cabana = $arquitecto->construir(new BuilderCabana());
$cabana->mostrar(); // Construcción: Cimientos de madera, Paredes de troncos, Techo de paja💡 En la vida real
El Builder es ideal cuando tienes objetos con muchos pasos de construcción o configuraciones opcionales. En PHP lo verás en frameworks cuando se crean:
- Consultas SQL paso a paso (Query Builder de Laravel)
- Formularios configurables
- Configuradores de APIs o clases con muchas propiedades
🎨 En resumen
El Builder te permite separar el “qué construir” del “cómo construirlo”, para que puedas crear castillos, cabañas o torres de magos… sin romper tu código 🪄
Eso ha sido todo por hoy.
Nos vemos en el próximo patrón... o en la próxima frikada que se me ocurra para explicarlo 👾