¡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. Patrones de diseño en Java
  3. El patrón Builder
Extrait - Patrones de diseño en Java Los 23 modelos de diseño: descripciónes y soluciónes ilustradas en UML 2 y Java [3ª edición]
Extractos del libro
Patrones de diseño en Java Los 23 modelos de diseño: descripciónes y soluciónes ilustradas en UML 2 y Java [3ª edición] Volver a la página de compra del libro

El patrón Builder

Descripción

El objetivo del patrón Builder es abstraer la construcción de objetos complejos de su implementación, de modo que un cliente pueda crear objetos complejos sin tener que preocuparse de las diferencias en su implantació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 ConstructorDocumentaciónVehículoHtml y, en el segundo caso, una instancia de la clase ConstructorDocumentaciónVehículoPdf. 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 construyeSolicitudPedido y construyeSolicitudMatriculación.

El conjunto de clases del patrón Builder para este ejemplo se detalla en la figura 2-3.1. Esta figura muestra la jerarquía entre las clases ConstructorDocumentaciónVehículo y Documentación.

El vendedor puede crear las solicitudes de pedido y las solicitudes de matriculación sin conocer las subclases de ConstructorDocumentaciónVehículo ni las de Documentación.

Las relaciones de dependencia entre el cliente y las subclases de ConstructorDocumentaciónVehículo se explican por el hecho de que el cliente crea una instancia de estas subclases.

La estructura interna de las subclases concretas de Documentación...

Estructura

1. Diagrama de clases

La figura 2-3.2 detalla la estructura genérica del patrón.

images/figure34.PNG

Figura 2-3.2 - Estructura del patrón Builder

2. Participantes

Los participantes del patrón son los siguientes:

  • ConstructorAbstracto (ConstructorDocumentaciónVehículo) es la clase que define la firma de los métodos que construyen las distintas partes del producto así como la firma del método que permite obtener el producto, una vez construido.

  • ConstructorConcreto (ConstructorDocumentaciónVehículoHtml y ConstructorDocumentaciónVehículoPdf) es la clase concreta que implementa los métodos del constructor abstracto.

  • Producto (Documentación) es la clase que define el producto. Puede ser abstracta y poseer varias subclases concretas (DocumentaciónHtml y DocumentaciónPdf) en caso de implementaciones diferentes.

  • Director es la clase encargada de construir el producto a partir de la interfaz del constructor abstracto.

3. Colaboraciones

El cliente crea un constructor concreto y un director. El director construye, bajo demanda del cliente, invocando al constructor y reenvía el resultado al cliente.

La figura 2-3.3 ilustra este funcionamiento con un diagrama de secuencia UML.

images/figure35.PNG

Figura 2-3.3 - Diagrama de secuencia del patrón Builder

Dominios de uso

El patrón se utiliza en los dominios siguientes:

  • Un cliente necesita construir objetos complejos sin conocer su implementación.

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

Ejemplo en Java

Presentamos a continuación un ejemplo de uso del patrón escrito en Java. El código Java correspondiente a la clase abstracta Documentacion y sus subclases aparece a continuación. Por motivos de simplicidad, los documentos son 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.

import java.util.*;  
  
public abstract class Documentacion  
{  
    protected List<String> contenido =  
        new ArrayList<String>();  
  
    public abstract void agregaDocumento(String documento);  
    public abstract void imprime();  
}  
  
public class DocumentacionHtml extends Documentacion  
{  
    public void agregaDocumento(String documento)  
    {  
        if (documento.startsWith("<HTML>"))  
            contenido.add(documento);  
    }  
  
    public void imprime()  
    {  
        System.out.println("Documentacion HTML");  
        for (String s: contenido)  
            System.out.println(s);  
    }  
}  
  
public class DocumentacionPdf extends Documentacion  
{  
    public void agregaDocumento(String documento)  
    {  
        if (documento.startsWith("<PDF>"))  
            contenido.add(documento);  
    }  
  
    public...