Kako se koristi obrazac dizajna prototipa u .NET-u

Obrasci dizajna koriste se za rješavanje ponavljajućih problema i složenosti u razvoju softvera. Uzorak prototipa pripada kategoriji kreativni uzorci dizajna i koristi se za stvaranje klona predmeta. Uzorci kreativnog dizajna bave se stvaranjem predmeta i upravljanjem postupkom stvaranja predmeta u vašoj aplikaciji. Tipični primjeri dizajnerskih uzoraka koji spadaju u kategoriju kreativnih uzoraka uključuju apstraktnu tvornicu, graditelja, tvorničku metodu, prototip i pojedinačne uzorke.

Uzorak dizajna prototipa omogućuje vam stvaranje nove instance klase od postojeće instance. Možete iskoristiti ovaj obrazac dizajna za stvaranje klona predmeta kad je sam postupak stvaranja predmeta skupa stvar. Imajte na umu da je kloniranje definirano kao postupak stvaranja točne kopije objekta. Postoje dvije vrste kloniranja: duboka i plitka kopija.

Plitka kopija nasuprot dubokom kloniranju

Plitko kopiranje izvodi se metodom Object.MemberwiseClone i kopira nestatična polja objekta, dok se dubinska kopija koristi za kopiranje i reference i vrijednosti i daje vam zasebnu instancu na objektu. Više dubinskih i plitkih kopija možete naučiti iz mog članka ovdje.

Sudionici (razredi i objekti) u tipičnoj implementaciji uzorka prototipa uključuju sljedeće:

  • Prototip - ovo definira sučelje za samo kloniranje
  • ConcretePrototype - ovo definira tip koji provodi operaciju kloniranja
  • Klijent - ovo definira potrošača koji može stvoriti novu instancu kloniranjem prototipa

Imajući ovo na umu, ovdje ćemo implementirati uzorak prototipa koristeći tri vrste. To uključuje sljedeće:

  • Kupac
  • CustomerManager
  • Korisnički prototip

Stvorite prototip apstraktne klase u .NET-u

Pogledajte klasu CustomerPrototype koja je navedena u nastavku.

[Serijalizira se ()]

javna apstraktna klasa CustomerPrototype

    {

        javni sažetak ClonePrototype Clone (bool performDeepCopy);

    }

Klasa CustomerPrototype apstraktne je prirode i sadrži jednu apstraktnu metodu pod nazivom Klon. Ova metoda prihvaća logički parametar pod nazivom performDeepCopy. Ako je parametar koji mu je proslijeđen istina, izvest će dubinsku kopiju, u suprotnom plitku kopiju.

Stvorite konkretnu klasu prototipa u .NET-u

Slijedi klasa CustomerManager. Sadrži Rječnik koji u sebi pohranjuje instance klase Customer (to je samo još jedna POCO klasa). Sadrži i indeksator nazvan CustomerPrototype. Svojstvo set indeksera koristi se za pohranu podataka u instancu Rječnika imenovanu kupci.

  javna klasa CustomerManager

    {

     kupci privatnog rječnika = novi rječnik ();

        javni kupacPrototip ovo [int index]

        {

            dobiti {povratak kupaca [indeks]; }

            set {kupci.Dodaj (indeks, vrijednost); }

        }

    }

Stvorite prototipsku klasu klijenta u .NET-u

Sljedeća je klasa Customer. Sadrži dva svojstva, i to Ime i Prezime i dvije metode, Clone i DeepCopy.

[Serijalizira se ()]

    javna klasa Kupac: KupacPrototype

    {

        javni niz FirstName

        {

            pripremi se;

        }

        javni niz LastName

        {

            dobiti; postavljen;

        }

        javno nadjačati CustomerPrototype Clone (bool deepClone)

        {

            prekidač (deepClone)

            {

                slučaj istina:

                    vrati this.DeepCopy (ovo) kao CustomerPrototype;

                case false:

                    vrati this.MemberwiseClone () kao CustomerPrototype;

                zadano:

                    vrati this.MemberwiseClone () kao CustomerPrototype;

            }

        }

        privatna T DeepCopy (T obj)

        {

           // Ovdje napišite kod za dubinsko kopiranje.

        }

     }

Preskočio sam izvorni kod metode DeepCopy u gornjem popisu kodova, jer je već dostupan u mom ranijem članku ovdje.

Stvorite dubinsku kopiju objekta u .NET-u

Sljedeći isječak koda ilustrira kako možete iskoristiti klasu CustomerManager koju smo ranije stvorili za dubinsko kopiranje.

CustomerManager customerManager = novi CustomerManager ();

Kupac custObj1 = novi kupac ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Kupac custObj2 = novi kupac ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Kupac kupac = customerManager [0] .Kloniraj (true) kao Kupac;

Imajte na umu da smo metodu Clone proslijedili "true" kao parametar za dubinsko kopiranje.

Stvorite plitku kopiju objekta u .NET-u

Slično tome, mogli biste proslijediti "false" kao parametar istoj metodi za izvođenje plitke kopije. Evo kako to možete postići.

Kupac kupac = customerManager [0] .Kloniraj (netačno) kao Kupac;

Na kraju, ovdje je potpuni kod glavne metode za vašu referencu.

statička praznina Main (string [] args)

      {

      CustomerManager customerManager = novi CustomerManager ();

      Kupac custObj1 = novi kupac ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      Kupac custObj2 = novi kupac ();

      custObj2.FirstName = "Stephen";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Kupac kupac = customerManager [0] .Kloniraj (true) kao Kupac;

      Console.ReadKey ();

      }