Patrón Builder

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 👾