jueves, 1 de octubre de 2020

Patrones de diseño: Prototipo

Para generar objetos a partir de otros sin tener que crearlos de cero se puede usar el patrón prototipo. Para ello se genera un clon de un objeto (en C# se hace utilizando la interfaz ICloneable).
Debemos distinguir dos tipos de clonación: shallow copy y deep copy. El primero clona un objeto y copia el valor de todas las propiedades del mismo. Sin embargo, en el caso de los tipos por referencia se copia la referencia. En el segundo caso, las propiedades se copian como en el primer caso aunque la diferencia se encuentra para los tipos por referencia que se clonan también.
A continuación se puede ver un ejemplo sencillo de su utilización.

using System;
public class Program
{
public static void Main()
{
Person p = new Person();
p.name = "Edward";
p.surname = "Reddington";
p.age = 48;
p.addr = new Address("Main Street, 16");
Console.WriteLine("Person 1 - " + p.name + " " + p.surname + ", " + p.age + ", " + p.addr.street);
Person p2 = (Person)p.Clone();
Console.WriteLine("Person 2 - " + p2.name + " " + p2.surname + ", " + p2.age + ", " + p2.addr.street);
p2.name = "Peter";
p2.surname = "Baltimore";
p2.addr = new Address("Eight Av. 132");
Console.WriteLine("Person 2 - " + p2.name + " " + p2.surname + ", " + p2.age + ", " + p2.addr.street);
}
}

public class Address:ICloneable {
public String street;
public Address(String street) {
this.street = street;
}
public object Clone() {
return this.MemberwiseClone();
}
}

public class Person:ICloneable {
public String name;
public String surname;
public int age;
public Address addr;
public object Clone() {
return this.MemberwiseClone();
}
}