¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. El patrón de diseño Builder
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

El patrón de diseño Builder

Descripción

El objetivo del patrón de diseño Builder es encapsular la construcción de objetos complejos, de modo que un cliente pueda crear objetos complejos sin tener que preocuparse de las diferentes etapas necesarias para su construcción.

Ejemplo

Durante la compra de un vehículo, el vendedor crea todo un conjunto de documentos que contienen en especial la solicitud de pedido y la solicitud de matriculación del cliente. Es posible construir estos documentos en formato HTML o en formato PDF según la elección del cliente. En el primer caso, el cliente le provee una instancia de la clase ConstructorDocumentacionVehiculoHtml y, en el segundo caso, una instancia de la clase ConstructorDocumentacionVehiculoPdf. El vendedor realiza, a continuación, la solicitud de creación de cada documento mediante esta instancia.

De este modo el vendedor genera la documentación con ayuda de los métodos generaFormularioPedido y generaSolicitudMatriculacion.

El conjunto de clases del patrón de diseño Builder para este ejemplo se detalla en la figura 5.1. Esta figura muestra la jerarquía entre las clases ConstructorDocumentacionVehiculo y Documentacion. El vendedor puede crear las solicitudes de pedido y las solicitudes de matriculación sin conocer las subclases de ConstructorDocumentacionVehiculo ni las de Documentacion.

Las relaciones de dependencia entre el cliente y las subclases de ConstructorDocumentacionVehiculo se explican por el hecho de que el cliente crea una instancia de estas subclases.

La estructura interna de las subclases concretas de Documentacion no se muestra (entre ellas, por ejemplo, la relación de composición...

Estructura

1. Diagrama de clases

La figura 5.2 detalla la estructura genérica del patrón de diseño Builder.

images/figure34.PNG

Figura 5.2 - Estructura del patrón de diseño Builder

2. Participantes

Los participantes del patrón de diseño Builder son los siguientes:

  • ConstructorAbstracto (AbstractConstructorDocumentacion Vehiculo) es la abstracción que contiene las firmas de los métodos que van a construir las distintas partes del producto así como la firma del método que permite obtener el producto, una vez construido.

  • ConstructorConcreto (ConstructorDocumentacionVehiculoHtml y ConstructorDocumentacionVehiculoPdf) es la clase concreta que implementa los métodos de constructorAbstracto.

  • Producto (AbstractDocumentacion) es la clase que define el producto. Puede ser abstracta y poseer varias subclases concretas (DocumentacionHtml y DocumentacionPdf) en caso de implementaciones diferentes.

  • Director (Vendedor) es la clase encargada de construir el producto utilizando la interfaz que expone ConstructorAbstracto.

3. Colaboraciones

El cliente crea un constructor concreto y un director. El director construye, bajo demanda del cliente, invocando los métodos adecuados del constructor concreto que se le pasa y devuelve el resultado al cliente.

La figura 5.3 ilustra este funcionamiento mediante un diagrama de secuencia UML.

images/figure35.PNG

Figura 5.3 - Diagrama de secuencia del patrón de diseño Builder

Dominios de uso

El patrón de diseño Builder se utiliza en los dominios siguientes:

  • Un cliente necesita construir objetos complejos sin tener que conocer los detalles de su implementación.

  • Un cliente necesita construir objetos complejos que tienen varias representaciones o implementaciones.

Ejemplo en PHP

Presentamos a continuación un ejemplo de uso del patrón de diseño Builder escrito en PHP. El código PHP correspondiente a la clase abstracta AbstractDocumentacion y sus subclases aparece a continuación. Por motivos de simplicidad, los documentos son aquí sencillas cadenas de caracteres para la documentación en formato HTML y PDF. El método imprime muestra las distintas cadenas de caracteres que representan los documentos.

<?php 
 
declare(strict_types=1);  
 
namespace ENI\DesignPatterns\Builder;  
 
abstract class AbstractDocumentacion  
{  
   protected array $contenido;  
 
   abstract public function agregaDocumento(string $documento): void; 
 
   abstract public function imprime(): void;  
}  
 
<?php  
 
declare(strict_types=1);  
 
namespace ENI\DesignPatterns\Builder;  
 
class DocumentacionHtml extends AbstractDocumentacion  
{  
   public function agregaDocumento(string $documento): void  
   {  
       if (str_starts_with($documento, '<HTML>')) {  
           $this->contenido[] = $documento;  
       }  
   }  
 
   public function imprime(): void  
   {  
       echo 'Documentación HTML' . PHP_EOL;  
 
       foreach ($this->contenido as $linea) {  
           echo $linea . PHP_EOL;  
       }  
}  
}  
<?php  
 
declare(strict_types=1);...