¡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 C#
  3. El patrón Prototype
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ª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 C#

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 MemberwiseClone que proporciona C#.

El método MemberwiseClone de C# nos evita tener que escribir un código que copie cada atributo mediante una instrucción específica. Por consiguiente, el método duplica puede introducirse de forma concreta en la clase abstracta Documento.

using System; 
 
public abstract class Documento 
{ 
    protected string contenido = ""; 
 
    public Documento duplica() 
    { 
        Documento resultado; 
        resultado = (Documento)this.MemberwiseClone(); 
        return resultado; 
    } 
 
    public void rellena(string informacion) 
    { 
        contenido = informacion; 
    } 
 
    public abstract void imprime(); 
    public abstract void visualiza(); 
} 
 
 
using System; 
 
public class OrdenDePedido : Documento 
{ 
    public override void visualiza() 
    { 
          Console.WriteLine("Muestra la orden de pedido: " + 
          contenido); 
    } 
 
    public override...