11-06-2025

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.