PATRÓN BUILDER EN PHP: QUÉ ES Y CÓMO IMPLEMENTARLO

El patrón Builder en php es un patrón de diseño creacional que se utiliza para construir objetos complejos paso a paso. En lugar de crear un objeto con un constructor que recibe muchos parámetros, el patrón Builder permite configurar el objeto de manera más flexible y legible, separando la construcción del objeto de su representación final.
Cómo funciona:
  1. Builder (Constructor): Define una interfaz o clase abstracta con métodos para construir las diferentes partes del objeto.
  2. ConcreteBuilder (Constructor concreto): Implementa la interfaz del builder y define cómo se construyen las partes específicas del objeto.
  3. Director: Controla el proceso de construcción, usando el builder para crear el objeto en el orden correcto.
  4. Producto: Es el objeto complejo que estamos construyendo.
Ejemplo de código:

// Producto
class Casa {
    public $puertas = [];
    public $ventanas = [];
    public $techo;

    public function mostrar() {
   echo "Puertas: " . implode(', ', $this->puertas) . "\n";
   echo "Ventanas: " . implode(', ', $this->ventanas) . "\n";
   echo "Techo: " . $this->techo . "\n";
    }
}

// Builder
interface CasaBuilder {
    public function construirPuerta();
    public function construirVentana();
    public function construirTecho();
    public function getCasa();
}

// Constructor concreto
class CasaModernaBuilder implements CasaBuilder {
    private $casa;

    public function __construct() {
   $this->casa = new Casa();
    }

    public function construirPuerta() {
   $this->casa->puertas[] = "Puerta moderna de vidrio";
    }

    public function construirVentana() {
   $this->casa->ventanas[] = "Ventana grande de aluminio";
    }

    public function construirTecho() {
   $this->casa->techo = "Techo plano";
    }

    public function getCasa() {
   return $this->casa;
    }
}

// Director
class Director {
    private $builder;

    public function __construct(CasaBuilder $builder) {
   $this->builder = $builder;
    }

    public function construirCasa() {
   $this->builder->construirPuerta();
   $this->builder->construirVentana();
   $this->builder->construirTecho();
    }
}

// Uso
$builder = new CasaModernaBuilder();
$director = new Director($builder);
$director->construirCasa();

$casa = $builder->getCasa();
$casa->mostrar();

Explicación del código

  • Producto (Casa): Es el objeto final que queremos construir, con propiedades como habitaciones, tejado y garaje.
  • Interfaz CasaBuilder: Define los métodos que cualquier Builder concreto debe implementar.
  • Builder Concreto (CasaConcretaBuilder): Implementa la interfaz y construye el objeto Casa paso a paso. Usa un método fluido (retorna $this) para encadenar llamadas.
  • Director (Arquitecto): Opcional, define un flujo predefinido para construir una casa (en este caso, una casa moderna).
  • Uso: Puedes construir una casa usando el director para configuraciones predefinidas o manualmente con el Builder para configuraciones personalizadas.

Ventajas del patrón Builder

  • Legibilidad: Código más claro al configurar objetos complejos.
  • Flexibilidad: Permite crear diferentes configuraciones del mismo objeto.
  • Encapsulación: Separa la construcción del objeto de su uso.
  • Métodos fluidos: Encadenar métodos mejora la experiencia de escritura.

Desventajas

  • Complejidad adicional: Para objetos simples, puede ser innecesario.
  • Más código: Requiere crear varias clases e interfaces.

Cuándo usar el patrón Builder

  • Cuando un objeto tiene muchos parámetros opcionales.
  • Cuando necesitas construir objetos inmutables (puedes hacer que el Builder cree un objeto final inmutable).
  • Cuando quieres reutilizar configuraciones comunes o tener diferentes representaciones del mismo objeto.