
PATRÓN BUILDER EN 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:
- Builder (Constructor): Define una interfaz o clase abstracta con métodos para construir las diferentes partes del objeto.
- ConcreteBuilder (Constructor concreto): Implementa la interfaz del builder y define cómo se construyen las partes específicas del objeto.
- Director: Controla el proceso de construcción, usando el builder para crear el objeto en el orden correcto.
- Producto: Es el objeto complejo que estamos construyendo.
// 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.