Design pattern

in C#, Informatica, Programmazione

Design Patterns – Prototype

Tipologia: Creazionale

Frequenza di utilizzo: Media

Obiettivo: definire gli oggetti da creare utilizzando un’istanza prototipo, creando nuovi oggetti copiando l’istanza del prototipo.

Design Patterns - Prototype

Schema UML – Prototype

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).