Tipologia: Creazionale
Frequenza di utilizzo: Media
Obiettivo: definire gli oggetti da creare utilizzando un’istanza prototipo, creando nuovi oggetti copiando l’istanza del prototipo.
Componenti:
- Prototype: dichiara l’interfaccia per poter effetture la clonazione (auto-clonazione)
- Concrete Prototype: implementa l’operazione per effettuare la clonazione
- Client: crea un nuovo oggetto richiedendo al prototipo di effettuare la clonazione (auto-clonazione)
Implementazione in C#
La prima classe da definire è la Prototype:
abstract class ColorPrototype
{
public abstract ColorPrototype Clone();
}
con la definizione del metodo per effettuare la clonazione degli oggetti. Si procede quindi con la definizione della classe Concrete Prototype che implementa la classe ColorPrototype:
class Color : ColorPrototype
{
private int _red;
private int _green;
private int _blue;
public Color(int red, int green, int blue)
{
this._red = red;
this._green = green;
this._blue = blue;
}
public override ColorPrototype Clone()
{
Console.WriteLine(
"Cloning color RGB: {0,3},{1,3},{2,3}",
_red, _green, _blue);
return this.MemberwiseClone() as ColorPrototype;
}
}
con l’implementazione del metodo Clone (definito nella classe astratta). Il Client, o meglio il manager, sarà così definito:
class ColorManager
{
private Dictionary<string, ColorPrototype> _colors =
new Dictionary<string, ColorPrototype>();
public ColorPrototype this[string key]
{
get { return _colors[key]; }
set { _colors.Add(key, value); }
}
}
Per poter utilizzare il Client necessario crearne un’istanza, aggiungere elementi che potranno essere recuperati tramite clonazione:
ColorManager colormanager = new ColorManager(); colormanager["red"] = new Color(255, 0, 0); //Utilizzo tramite clonazione Color color1 = colormanager["red"].Clone() as Color;
E’ da notare come il Client sia responsabile della generazione di un nuovo oggetto proprio effettuando la clonazione (invocando il metodo Clone).
