Blog de Gonzalo

Blog de programación de Gonzalo López

PATRÓN BUILDER EN PHP

PHP

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.

Compartir en twitter