Come utilizzare il modello di progettazione del prototipo in .NET

I modelli di progettazione vengono utilizzati per risolvere problemi ricorrenti e complessità nello sviluppo del software. Il modello prototipo appartiene alla categoria dei modelli di design creativi e viene utilizzato per creare un clone di un oggetto. I modelli di progettazione creazionali riguardano la creazione di oggetti e la gestione del processo di creazione degli oggetti nell'applicazione. Esempi tipici dei modelli di progettazione che rientrano nella categoria dei modelli di creazione includono la fabbrica astratta, il costruttore, il metodo di fabbrica, il prototipo e i modelli singleton.

Il modello di progettazione del prototipo consente di creare una nuova istanza di una classe da un'istanza esistente. È possibile sfruttare questo modello di progettazione per creare un clone di un oggetto quando il processo di creazione dell'oggetto stesso è un affare costoso. Nota che la clonazione è definita come il processo di creazione di una copia esatta di un oggetto. Esistono due tipi di clonazione: copia profonda e copia superficiale.

Copia superficiale e copia profonda

La copia superficiale viene eseguita utilizzando il metodo Object.MemberwiseClone e copia i campi non statici di un oggetto, mentre la copia profonda viene utilizzata per copiare sia il tipo di riferimento che il tipo di valore e fornisce un'istanza distinta su un oggetto. Puoi imparare una copia più profonda e una copia superficiale dal mio articolo qui.

I partecipanti (classi e oggetti) in un'implementazione tipica del modello prototipo includono quanto segue:

  • Prototipo: definisce un'interfaccia per la clonazione stessa
  • ConcretePrototype: definisce un tipo che implementa l'operazione per la clonazione stessa
  • Client: definisce il consumatore che può creare una nuova istanza clonando un prototipo

Tenendo presente questo, implementeremo qui il modello prototipo utilizzando tre tipi. Questi includono quanto segue:

  • Cliente
  • CustomerManager
  • CustomerPrototype

Crea un prototipo di classe astratta in .NET

Fare riferimento alla classe CustomerPrototype riportata di seguito.

[Serializable ()]

public abstract class CustomerPrototype

    {

        public abstract CustomerPrototype Clone (bool performDeepCopy);

    }

La classe CustomerPrototype è di natura astratta e contiene un metodo astratto denominato Clone. Questo metodo accetta un parametro booleano denominato performDeepCopy. Se il parametro passato ad esso è vero, eseguirà una copia profonda, altrimenti una copia superficiale.

Crea una classe prototipo concreta in .NET

Successivamente viene fornita la classe CustomerManager. Contiene un Dictionary che memorizza le istanze della classe Customer (è solo un'altra classe POCO) al suo interno. Contiene anche un indicizzatore denominato CustomerPrototype. La proprietà set dell'indicizzatore viene utilizzata per archiviare i dati nell'istanza di Dictionary denominata clienti.

  CustomerManager di classe pubblica

    {

     dizionario privato clienti = nuovo dizionario ();

        public CustomerPrototype this [int index]

        {

            get {return customers [indice]; }

            set {customers.Add (index, value); }

        }

    }

Crea una classe client prototipo in .NET

Successivamente viene fornita la classe Customer. Contiene due proprietà, ovvero FirstName e LastName, e due metodi, Clone e DeepCopy.

[Serializable ()]

    public class Cliente: CustomerPrototype

    {

        stringa pubblica FirstName

        {

            preparatevi;

        }

        stringa pubblica LastName

        {

            ottenere; impostato;

        }

        public override CustomerPrototype Clone (bool deepClone)

        {

            interruttore (deepClone)

            {

                caso vero:

                    restituire this.DeepCopy (this) as CustomerPrototype;

                caso falso:

                    restituire this.MemberwiseClone () come CustomerPrototype;

                predefinito:

                    restituire this.MemberwiseClone () come CustomerPrototype;

            }

        }

        privato T DeepCopy (T obj)

        {

           // Scrivi qui il codice per eseguire la copia completa.

        }

     }

Ho ignorato il codice sorgente del metodo DeepCopy nell'elenco di codice sopra poiché è già disponibile nel mio articolo precedente qui.

Crea una copia completa di un oggetto in .NET

Il frammento di codice seguente illustra come sfruttare la classe CustomerManager creata in precedenza per eseguire una copia completa.

CustomerManager customerManager = nuovo CustomerManager ();

Cliente custObj1 = nuovo cliente ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Cliente custObj2 = nuovo cliente ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Cliente cliente = CustomerManager [0] .Clone (true) as Customer;

Notare che abbiamo passato "true" come parametro al metodo Clone per eseguire una copia completa.

Crea una copia superficiale di un oggetto in .NET

Allo stesso modo, potresti passare "false" come parametro allo stesso metodo per eseguire una copia superficiale. Ecco come puoi ottenerlo.

Customer customer = customerManager [0] .Clone (false) as Customer;

Infine, ecco il codice completo del metodo Main come riferimento.

static void Main (string [] args)

      {

      CustomerManager customerManager = nuovo CustomerManager ();

      Cliente custObj1 = nuovo cliente ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      Cliente custObj2 = nuovo cliente ();

      custObj2.FirstName = "Stephen";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Cliente cliente = CustomerManager [0] .Clone (true) as Customer;

      Console.ReadKey ();

      }