¡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 Prototype
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 Prototype

Descripción

El objetivo de este patrón es la creación de nuevos objetos mediante duplicación de objetos existentes llamados prototipos que disponen de la capacidad de clonación.

Ejemplo

Durante la compra de un vehículo, un cliente debe recibir una documentación compuesta por un número concreto de documentos tales como el certificado de cesión, la solicitud de matriculación o incluso la orden de pedido. Existen otros tipos de documentos que pueden incluirse o excluirse a esta documentación en función de las necesidades de gestión o de cambios de reglamentación. Introducimos una clase Documentación cuyas instancias son documentaciones compuestas por diversos documentos obligatorios. Para cada tipo de documento, incluimos su clase correspondiente.

A continuación creamos un modelo de documentación que consiste en una instancia particular de la clase Documentación y que contiene los distintos documentos necesarios, documentos en blanco. Llamamos a esta documentación "documentación en blanco". De este modo definimos a nivel de las instancias, y no a nivel de las clases, el contenido preciso de la documentación que debe recibir un cliente. Incluir o excluir un documento en la documentación en blanco no supone ninguna modificación en su clase.

Una vez presentada la documentación en blanco, recurrimos al proceso de clonación para crear las nuevas documentaciones. Cada nueva documentación se crea duplicando todos los documentos de la documentación en blanco.

Esta técnica basada en objetos...

Estructura

1. Diagrama de clases

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

images/figure7-2.png

Figura 2-5.2 - Estructura del patrón Prototype

2. Participantes

Los participantes del patrón son los siguientes:

  • Cliente (Documentación, DocumentaciónCliente, DocumentaciónEnBlanco) es una clase compuesta por un conjunto de objetos llamados prototipos, instancias de la clase abstracta Prototype. La clase Cliente necesita duplicar estos prototipos sin tener por qué conocer ni la estructura interna del Prototype ni su jerarquía de subclases.

  • Prototype (Documento) es una clase abstracta de objetos capaces de duplicarse a sí mismos. Incluye la firma del método "duplica".

  • PrototypeConcreto1 y PrototypeConcreto2 (OrdenDePedido, SolicitudMatriculación, CertificadoCesión) son las subclases concretas de Prototype que definen completamente un prototipo e implementan el método duplica.

3. Colaboración

El cliente solicita a uno o varios prototipos que se dupliquen a sí mismos.

Dominios de uso

El patrón Prototype se utiliza en los dominios siguientes:

  • Un sistema de objetos debe crear instancias sin conocer la jerarquía de clases que las describe.

  • Un sistema de objetos debe crear instancias de clases dinámicamente.

  • El sistema de objetos debe permanecer simple y no incluir una jerarquía paralela de clases de fabricación.

Ejemplo en Java

El código fuente de la clase abstracta Documento y de sus subclases concretas aparece a continuación. Para simplificar, a diferencia del diagrama de clases, los métodos duplica y rellena se concretan en la clase Documento. El método duplica utiliza el método clone que proporciona Java.

El método clone de Java nos evita tener que copiar manualmente cada atributo. En consecuencia, es posible implementar el método duplica completamente en la clase abstracta Documento.

public abstract class Documento  
implements Cloneable 
{  
    protected String contenido = new String();  
  
    public Documento duplica()  
    {  
        Documento resultado;  
 
    try 
    { 
        resultado = (Documento)this.clone();  
    } 
    catch (CloneNotSupportedException exception)  
    {  
      return null;  
    }  
    return resultado;  
    }  
  
    public void rellena(String informacion)  
    {  
        contenido = informacion;  
    }  
  
    public abstract void imprime();  
    public abstract void visualiza();  
}  
  
  
public class OrdenDePedido extends Documento  
{  
    public void visualiza()  
    {  
        System.out.println("Muestra la orden de pedido: " +  
          contenido);  ...