Definición: Utilizar instancias prototipo para especificar el tipo de objeto a crear y generar nuevos objetos mediante la clonación de estos prototipos.
Ventajas:
- El patrón prototipo oculta al cliente la complejidad de crear nuevas instancias
- Permite agregar o eliminar dinámicamente clases de productos.
- Simplifica la estructura de creación de instancias. El patrón de método de fábrica requiere una estructura jerárquica similar a la de las clases de productos, mientras que el patrón prototipo no necesita esta restricción.
- Las clases de productos no requieren una estructura jerárquica predefinida, ya que el patrón prototipo es aplicable a cualquier estructura jerárquica.
Desventajas:
- Cada clase debe implementar un método de clonación
- Implementar un método de clonación requiere una consideración exhaustiva de la funcionalidad de la clace. Esto puede no ser difícil para clases completamente nuevas, pero puede ser complicado para clases existentes, especialmente cuando una clase hace referencia a objetos indirectos que no admiten serialización, o cuando contiene estructuras circualres.
Ejemplo de código
/*
Patrón Prototipo: Abreviado como Prot, utiliza instancias prototipo para especificar el tipo de objeto a crear
y genera nuevos objetos mediante la clonación de estos prototipos
Prototipo Abstracto: Clase BaseProt,
Prototipo Concreto: Clase DeportivoProt
*/
public abstract class BaseProt {
private string identificador;
public string Identificador
{
get { return identificador;}
private set{ identificador = value; }
}
public BaseProt(string _identificador)
{
this.Identificador = _identificador;
UnityEngine.Debug.Log ("Instancia creada");//Podemos ver que se crean múltiples objetos con solo una llamada a new
}
public abstract BaseProt Duplicar();
}
public class DeportivoProt : BaseProt {
public DeportivoProt (string _identificador):base(_identificador){}
public override BaseProt Duplicar ()
{
return (BaseProt)this.MemberwiseClone ();
}
}
using UnityEngine;
public class ClienteProt : MonoBehaviour {
void Start(){
BaseProt vehiculoPrototipo=new DeportivoProt("Deportivo");
BaseProt DeportivoCopia_1 = vehiculoPrototipo.Duplicar() as DeportivoProt;
Debug.Log (DeportivoCopia_1.Identificador);
BaseProt DeportivoCopia_2 = vehiculoPrototipo.Duplicar() as DeportivoProt;
Debug.Log (DeportivoCopia_2.Identificador);
BaseProt DeportivoCopia_3 = vehiculoPrototipo.Duplicar() as DeportivoProt;
Debug.Log (DeportivoCopia_3.Identificador);
BaseProt DeportivoCopia_4 = vehiculoPrototipo.Duplicar() as DeportivoProt;
Debug.Log (DeportivoCopia_4.Identificador);
}
}
En .NET, el patrón prototipo se puede implementar fácilmente mediante la interfaz ICloneable (que actúa como prototipo y proporciona un método de clonación, similar a la clase BaseProt abstracta en el código anterior). Si queremos que nuestras clases personalizadas tengan funcionalidad de clonación, primero debemos definir que la clase herede de la interfaz ICloneable e implemantar el método Clone.