Verwendung des Prototyp-Entwurfsmusters in .NET

Entwurfsmuster werden verwendet, um wiederkehrende Probleme und Komplexitäten in der Softwareentwicklung zu lösen. Das Prototypmuster gehört zur Kategorie der Entwurfsmuster und wird zum Erstellen eines Klons eines Objekts verwendet. Erstellungsentwurfsmuster befassen sich mit der Objekterstellung und der Verwaltung des Objekterstellungsprozesses in Ihrer Anwendung. Typische Beispiele für Entwurfsmuster, die unter die Kategorie "Erstellungsmuster" fallen, sind die abstrakten Factory-, Builder-, Factory-Methoden-, Prototyp- und Singleton-Muster.

Mit dem Prototyp-Entwurfsmuster können Sie aus einer vorhandenen Instanz eine neue Instanz einer Klasse erstellen. Sie können dieses Entwurfsmuster nutzen, um einen Klon eines Objekts zu erstellen, wenn der Objekterstellungsprozess selbst eine kostspielige Angelegenheit ist. Beachten Sie, dass das Klonen als der Vorgang zum Erstellen einer exakten Kopie eines Objekts definiert ist. Es gibt zwei Arten des Klonens: Deep Copy und Flat Copy.

Flaches Kopieren im Vergleich zum Klonen von tiefen Kopien

Eine flache Kopie wird mit der Object.MemberwiseClone-Methode ausgeführt und kopiert die nicht statischen Felder eines Objekts, während eine tiefe Kopie sowohl zum Kopieren des Referenz- als auch des Wertetyps verwendet wird und Ihnen eine eindeutige Instanz für ein Objekt gibt. Sie können mehr tiefe Kopie und flache Kopie von meinem Artikel hier lernen.

Die Teilnehmer (Klassen und Objekte) an einer typischen Implementierung des Prototypmusters umfassen Folgendes:

  • Prototyp - Dies definiert eine Schnittstelle zum Klonen
  • ConcretePrototype - Dies definiert einen Typ, der die Operation zum Klonen selbst implementiert
  • Client - Hiermit wird der Consumer definiert, der durch Klonen eines Prototyps eine neue Instanz erstellen kann

Vor diesem Hintergrund werden wir das Prototypmuster hier mit drei Typen implementieren. Dazu gehören die folgenden:

  • Kunde
  • Kundenmanager
  • CustomerPrototype

Erstellen Sie eine abstrakte Prototypklasse in .NET

Weitere Informationen finden Sie in der unten angegebenen CustomerPrototype-Klasse.

[Serializable ()]

öffentliche abstrakte Klasse CustomerPrototype

    {

        public abstract CustomerPrototype Clone (bool performDeepCopy);

    }}

Die CustomerPrototype-Klasse ist abstrakter Natur und enthält eine abstrakte Methode namens Clone. Diese Methode akzeptiert einen booleschen Parameter namens performDeepCopy. Wenn der an ihn übergebene Parameter wahr ist, wird eine tiefe Kopie ausgeführt, andernfalls eine flache Kopie.

Erstellen Sie eine konkrete Prototypklasse in .NET

Als nächstes wird die CustomerManager-Klasse angegeben. Es enthält ein Wörterbuch, in dem die Instanzen der Customer-Klasse (es ist nur eine andere POCO-Klasse) gespeichert sind. Es enthält auch einen Indexer namens CustomerPrototype. Die set-Eigenschaft des Indexers wird zum Speichern von Daten in der Dictionary-Instanz namens customers verwendet.

  öffentliche Klasse CustomerManager

    {

     private Dictionary Kunden = neues Dictionary ();

        public CustomerPrototype this [int index]

        {

            get {return customers [index]; }}

            set {customers.Add (Index, Wert); }}

        }}

    }}

Erstellen Sie eine Prototyp-Clientklasse in .NET

Die Kundenklasse wird als nächstes angegeben. Es enthält zwei Eigenschaften, nämlich Vorname und Nachname, und zwei Methoden, Klon und DeepCopy.

[Serializable ()]

    öffentliche Klasse Kunde: CustomerPrototype

    {

        öffentliche Zeichenfolge Vorname

        {

            bekommen; setzen;

        }}

        öffentliche Zeichenfolge Nachname

        {

            bekommen; einstellen;

        }}

        public override CustomerPrototype Clone (bool deepClone)

        {

            Schalter (deepClone)

            {

                Fall wahr:

                    return this.DeepCopy (this) als CustomerPrototype;

                case false:

                    return this.MemberwiseClone () als CustomerPrototype;

                Standard:

                    return this.MemberwiseClone () als CustomerPrototype;

            }}

        }}

        private T DeepCopy (T obj)

        {

           // Schreiben Sie hier Code, um eine tiefe Kopie durchzuführen.

        }}

     }}

Ich habe den Quellcode der DeepCopy-Methode in der obigen Codeliste übersprungen, da er bereits in meinem früheren Artikel hier verfügbar ist.

Erstellen Sie eine tiefe Kopie eines Objekts in .NET

Das folgende Codefragment zeigt, wie Sie die zuvor erstellte CustomerManager-Klasse nutzen können, um eine Tiefenkopie durchzuführen.

CustomerManager customerManager = neuer CustomerManager ();

Kunde custObj1 = neuer Kunde ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Kunde custObj2 = neuer Kunde ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Kunde customer = customerManager [0] .Clone (true) als Kunde;

Beachten Sie, dass wir "true" als Parameter an die Clone-Methode übergeben haben, um eine tiefe Kopie durchzuführen.

Erstellen Sie eine flache Kopie eines Objekts in .NET

In ähnlicher Weise können Sie "false" als Parameter an dieselbe Methode übergeben, um eine flache Kopie durchzuführen. So können Sie dies erreichen.

Kunde customer = customerManager [0] .Clone (false) als Kunde;

Schließlich finden Sie hier den vollständigen Code der Main-Methode als Referenz.

statische Leere Main (string [] args)

      {

      CustomerManager customerManager = neuer CustomerManager ();

      Kunde custObj1 = neuer Kunde ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      Kunde custObj2 = neuer Kunde ();

      custObj2.FirstName = "Stephen";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Kunde customer = customerManager [0] .Clone (true) als Kunde;

      Console.ReadKey ();

      }}