Hur man använder prototypdesignmönstret i .NET

Designmönster används för att lösa återkommande problem och komplexitet i mjukvaruutveckling. Prototypmönstret tillhör kategorin skapande designmönster och används för att skapa en klon av ett objekt. Skapande designmönster handlar om skapande av objekt och hantering av objektskapande i din applikation. Typiska exempel på designmönster som faller under kategorin skapande mönster inkluderar abstrakt fabrik, byggare, fabriksmetod, prototyp och singletonmönster.

Med prototypdesignmönstret kan du skapa en ny instans av en klass från en befintlig instans. Du kan dra nytta av detta designmönster för att skapa en klon av ett objekt när själva objektskapandet är en kostsam affär. Observera att kloning definieras som processen för att skapa en exakt kopia av ett objekt. Det finns två typer av kloning: djup kopia och grunt kopia.

Grund kopia kontra kloning av djup kopia

Grunn kopia utförs med metoden Object.MemberwiseClone och kopierar de icke-statiska fälten i ett objekt, medan djupkopia används för att kopiera både referens- och värdetyperna och ger dig en distinkt förekomst på ett objekt. Du kan lära dig mer djup kopia och grunt kopia från min artikel här.

Deltagarna (klasser och objekt) i en typisk implementering av prototypmönstret inkluderar följande:

  • Prototyp - detta definierar ett gränssnitt för att klona sig själv
  • ConcretePrototype - detta definierar en typ som implementerar operationen för att klona sig själv
  • Klient - detta definierar konsumenten som kan skapa en ny instans genom att klona en prototyp

Med tanke på detta implementerar vi prototypmönstret här med tre typer. Dessa inkluderar följande:

  • Kund
  • Kundansvarig
  • CustomerPrototype

Skapa en prototyp abstrakt klass i .NET

Se klassen CustomerPrototype nedan.

[Serialiserbar ()]

offentlig abstrakt klass CustomerPrototype

    {

        offentlig abstrakt CustomerPrototype Clone (bool performDeepCopy);

    }

Klassen CustomerPrototype är abstrakt till sin natur och innehåller en abstrakt metod som heter Clone. Denna metod accepterar en boolesk parameter med namnet performDeepCopy. Om parametern som skickas till den är sant kommer den att utföra en djup kopia, grunt annars.

Skapa en konkret prototypklass i .NET

CustomerManager-klassen ges nästa. Den innehåller en ordbok som lagrar förekomsterna av kundklassen (det är bara en annan POCO-klass) inuti den. Den innehåller också en indexerare som heter CustomerPrototype. Den inställda egenskapen för indexeraren används för att lagra data i ordboken som heter kunder.

  offentlig klass CustomerManager

    {

     privata ordbokskunder = ny ordbok ();

        public CustomerPrototype this [int index]

        {

            få {returkunder [index]; }

            ställa in {kunder.Add (index, värde); }

        }

    }

Skapa en prototypklientklass i .NET

Kundklassen ges därefter. Den innehåller två egenskaper, nämligen FirstName och LastName, och två metoder, Clone och DeepCopy.

[Serialiserbar ()]

    allmän klass Kund: CustomerPrototype

    {

        public string Förnamn

        {

            få; ställa in;

        }

        public string LastName

        {

            skaffa sig; uppsättning;

        }

        public åsidosätta CustomerPrototype Clone (bool deepClone)

        {

            switch (deepClone)

            {

                fall sant:

                    returnera detta.DeepCopy (detta) som CustomerPrototype;

                fall fel:

                    returnera denna.MemberwiseClone () som CustomerPrototype;

                standard:

                    returnera denna.MemberwiseClone () som CustomerPrototype;

            }

        }

        privat T DeepCopy (T obj)

        {

           // Skriv kod här för att utföra djupkopiering.

        }

     }

Jag har hoppat över källkoden för DeepCopy-metoden i ovanstående kodlista eftersom den redan finns i min tidigare artikel här.

Skapa en djup kopia av ett objekt i .NET

Följande kodavsnitt illustrerar hur du kan dra nytta av klassen CustomerManager som vi skapade tidigare för att utföra en djup kopia.

CustomerManager customerManager = ny CustomerManager ();

Kund custObj1 = ny kund ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Kund custObj2 = ny kund ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Kundkund = customerManager [0] .Clone (true) som kund;

Observera att vi har skickat "true" som en parameter till Clone-metoden för att utföra en djup kopia.

Skapa en grundkopia av ett objekt i .NET

På samma sätt kan du skicka "falskt" som en parameter till samma metod för att utföra en grunt kopia. Så här kan du uppnå detta.

Kundkund = customerManager [0] .Clone (false) som kund;

Slutligen, här är den fullständiga koden för Main-metoden för din referens.

static void Main (sträng [] args)

      {

      CustomerManager customerManager = ny CustomerManager ();

      Kund custObj1 = ny kund ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      Kund custObj2 = ny kund ();

      custObj2.FirstName = "Stephen";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Kundkund = customerManager [0] .Clone (true) som kund;

      Console.ReadKey ();

      }