Patrones de diseño - Prototipo

Este patrón nos permite duplicar un objeto que utilizamos como objeto prototipo. Se encuentra dentro de los patrones creacionales ya que nos va a devolver un nuevo objeto, un clon del original.

Necesidad

La creación de un objeto puede ser una tarea con un costo alto (de proceso, de tiempo, de recursos, etc.). Necesitamos una forma de clonar un objeto ya creado, siendo el objeto resultante una nueva instancia, no una referencia al objeto principal. 

Implementación

Vamos a crear diferentes clases de un objeto DetalleLibro que compartirán muchos de los atributos. Para ello crearemos una interfaz IModeloLibro que indicará que necesitamos un método de copia para los objetos que lo implementen. Esta es la representación usando el patrón prototipo:

Patrón Prototipo

Código en Vala

Esta es la interfaz que obliga a declarar un método clonar:

IModeloLibro.vala
public interface IModeloLibro : GLib.Object 
{ 
    public abstract string nombre { get; set; default=""; } 
    public abstract string encuaderna { get; set; default=""; } 
    public abstract string materia { get; set; default=""; } 
    public abstract IModeloLibro clonar ();  
     
    // Podemos implementar métodos en las interfaces 
    // declarandolos virtual 
    public virtual void ver () 
    { 
        print (@"Nombre: $(nombre)\n");  
        print (@"Encuadernación: $(encuaderna)\n");  
        print (@"Materia: $(materia)\n"); 
        print ("----------------------------\n");  
    } 
} 

Podemos ver que en vala es posible implementar métodos en las interfaces declarándolos virtual.

Lo siguiente que tenemos es la clase DetalleLibro con el método para clonar instancias devolviendo una copia de si mismo:

DetalleLibro.vala
public class DetalleLibro : GLib.Object, IModeloLibro 
{ 
    public string nombre { get; set; default=""; } 
    public string encuaderna { get; set; default=""; } 
    public string materia { get; set; default=""; } 
         
    public DetalleLibro (string nombre) 
    { 
        _nombre = nombre; 
    } 
     
    // En este método clonamos la instancia y devolvemos 
    // una nueva instancia Modelolibro con los datos copiados 
    public IModeloLibro clonar ()  
    { 
        DetalleLibro clonLibro = new DetalleLibro (_nombre); 
        clonLibro.encuaderna = _encuaderna; 
        clonLibro.materia = _materia; 
         
        return clonLibro; 
    } 
} 

Desde la función main creamos primero un prototipo de IModeloLibro y hacemos 2 copias Libro1Libro2:

UsoPatronPrototio.vala
public class UsoPatronPrototipo  
{ 
    public static int main (string[] args) 
    { 
        Intl.setlocale (ALL); 
         
        // Creamos el prototipo 
        IModeloLibro prototipoLibro = new DetalleLibro ("Desing Patterns"); 
        prototipoLibro.encuaderna = "Rústica"; 
        prototipoLibro.materia = "Computación"; 
         
        IModeloLibro Libro1 = prototipoLibro.clonar (); 
        IModeloLibro Libro2 = prototipoLibro.clonar ();  
         
        // Como las instancias son copias podemos modificar 
        // una sin modificar el resto  
        Libro2.nombre = "Unity Testing"; 
         
        Libro1.ver (); 
        Libro2.ver ();  
                             
        return 0; 
    } 
} 

Construimos y ejecutamos el programa:

❯ valac DetalleLibro.vala IModeloLibro.vala UsoPatronPrototipo.vala -o UsoPatronPrototipo
❯ ./UsoPatronPrototipo
Nombre: Desing Patterns
Encuadernación: Rústica
Materia: Computación
----------------------------
Nombre: Unity Testing
Encuadernación: Rústica
Materia: Computación
----------------------------

 

Indice de Patrones

Modificado por última vez enJueves, 22 Octubre 2020 20:19
(1 Voto)
Etiquetado como :

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.