Comment utiliser le modèle de conception de prototype dans .NET

Les modèles de conception sont utilisés pour résoudre des problèmes récurrents et des complexités dans le développement de logiciels. Le modèle prototype appartient à la catégorie des modèles de conception créative et est utilisé pour créer un clone d'un objet. Les modèles de conception créative concernent la création d'objets et la gestion du processus de création d'objets dans votre application. Les exemples typiques des modèles de conception qui relèvent de la catégorie des modèles de création incluent les modèles de fabrique abstraite, de constructeur, de méthode d'usine, de prototype et de singleton.

Le modèle de conception de prototype vous permet de créer une nouvelle instance d'une classe à partir d'une instance existante. Vous pouvez profiter de ce modèle de conception pour créer un clone d'un objet lorsque le processus de création d'objet lui-même est une affaire coûteuse. Notez que le clonage est défini comme le processus de création d'une copie exacte d'un objet. Il existe deux types de clonage: la copie profonde et la copie superficielle.

Copie superficielle vs clonage de copie profonde

La copie superficielle est effectuée à l'aide de la méthode Object.MemberwiseClone et copie les champs non statiques d'un objet, tandis que la copie profonde est utilisée pour copier à la fois les types référence et valeur et vous donne une instance distincte sur un objet. Vous pouvez en apprendre plus sur la copie profonde et la copie superficielle de mon article ici.

Les participants (classes et objets) dans une implémentation typique du modèle prototype sont les suivants:

  • Prototype - cela définit une interface pour se cloner
  • ConcretePrototype - cela définit un type qui implémente l'opération de clonage lui-même
  • Client - cela définit le consommateur qui peut créer une nouvelle instance en clonant un prototype

En gardant cela à l'esprit, nous allons implémenter le modèle de prototype ici en utilisant trois types. Ceux-ci comprennent les éléments suivants:

  • Client
  • Responsable Clientèle
  • ClientPrototype

Créer une classe abstraite prototype dans .NET

Reportez-vous à la classe CustomerPrototype donnée ci-dessous.

[Sérialisable ()]

classe abstraite publique CustomerPrototype

    {

        public abstract CustomerPrototype Clone (bool performDeepCopy);

    }

La classe CustomerPrototype est de nature abstraite et contient une méthode abstraite nommée Clone. Cette méthode accepte un paramètre booléen nommé performDeepCopy. Si le paramètre qui lui est passé est vrai, il effectuera une copie complète, sinon une copie superficielle.

Créer une classe prototype concrète dans .NET

La classe CustomerManager est donnée ensuite. Il contient un dictionnaire qui stocke les instances de la classe Customer (ce n'est qu'une autre classe POCO) à l'intérieur. Il contient également un indexeur nommé CustomerPrototype. La propriété set de l'indexeur est utilisée pour stocker des données dans l'instance de dictionnaire nommée clients.

  Classe publique CustomerManager

    {

     clients du dictionnaire privé = nouveau dictionnaire ();

        public CustomerPrototype this [int index]

        {

            obtenir {clients de retour [index]; }

            set {clients.Ajouter (index, valeur); }

        }

    }

Créer une classe client prototype dans .NET

La classe Customer est donnée ensuite. Il contient deux propriétés, à savoir FirstName et LastName, et deux méthodes, Clone et DeepCopy.

[Sérialisable ()]

    Client de classe publique: CustomerPrototype

    {

        chaîne publique FirstName

        {

            se mettre;

        }

        chaîne publique LastName

        {

            avoir; ensemble;

        }

        public override CustomerPrototype Clone (booléen deepClone)

        {

            commutateur (deepClone)

            {

                cas vrai:

                    renvoyez this.DeepCopy (this) comme CustomerPrototype;

                case false:

                    renvoyez this.MemberwiseClone () comme CustomerPrototype;

                défaut:

                    renvoyez this.MemberwiseClone () comme CustomerPrototype;

            }

        }

        Private T DeepCopy (T obj)

        {

           // Écrivez le code ici pour effectuer une copie profonde.

        }

     }

J'ai ignoré le code source de la méthode DeepCopy dans la liste de codes ci-dessus car il est déjà disponible dans mon article précédent ici.

Créer une copie complète d'un objet dans .NET

L'extrait de code suivant illustre comment vous pouvez tirer parti de la classe CustomerManager que nous avons créée précédemment pour effectuer une copie complète.

CustomerManager customerManager = nouveau CustomerManager ();

Client custObj1 = nouveau client ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Client custObj2 = nouveau client ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Client client = customerManager [0] .Clone (vrai) en tant que client;

Notez que nous avons passé «true» comme paramètre à la méthode Clone pour effectuer une copie complète.

Créer une copie superficielle d'un objet dans .NET

De même, vous pouvez passer «false» comme paramètre à la même méthode pour effectuer une copie superficielle. Voici comment vous pouvez y parvenir.

Client client = customerManager [0] .Clone (false) en tant que client;

Enfin, voici le code complet de la méthode Main pour votre référence.

static void Main (string [] args)

      {

      CustomerManager customerManager = nouveau CustomerManager ();

      Client custObj1 = nouveau client ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      Client custObj2 = nouveau client ();

      custObj2.FirstName = "Stephen";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Client client = customerManager [0] .Clone (vrai) en tant que client;

      Console.ReadKey ();

      }