Programiranje

Kako uporabiti vzorec oblikovanja prototipa v .NET

Vzorci oblikovanja se uporabljajo za reševanje ponavljajočih se težav in zapletenosti pri razvoju programske opreme. Prototipni vzorec spada v kategorijo kreativnih vzorcev oblikovanja in se uporablja za ustvarjanje klona predmeta. Vzorci kreativnega oblikovanja se ukvarjajo z ustvarjanjem predmetov in upravljanjem procesa ustvarjanja predmetov v vaši aplikaciji. Tipični primeri vzorčnih vzorcev, ki spadajo v kategorijo kreativnih vzorcev, vključujejo abstraktne tovarne, graditelje, tovarniške metode, prototipe in enojne vzorce.

Vzorec oblikovanja prototipa vam omogoča, da iz obstoječega primerka ustvarite nov primerek razreda. Ta vzorec načrtovanja lahko izkoristite za ustvarjanje klona predmeta, če je sam postopek ustvarjanja predmeta draga stvar. Upoštevajte, da je kloniranje opredeljeno kot postopek ustvarjanja natančne kopije predmeta. Obstajata dve vrsti kloniranja: globoka kopija in plitva kopija.

Plitka kopija proti kloniranju globoke kopije

Plitko kopiranje se izvede z uporabo metode Object.MemberwiseClone in kopira nestatična polja predmeta, medtem ko se globoka kopija uporablja za kopiranje referenčnih in vrednostnih vrst ter daje razločen primerek predmeta. Več podrobnih kopij in površnih kopij lahko izveste iz mojega članka tukaj.

Udeleženci (razredi in predmeti) v tipični izvedbi vzorca prototipa vključujejo naslednje:

  • Prototip - to opredeljuje vmesnik za samo kloniranje
  • ConcretePrototype - to določa vrsto, ki izvaja operacijo kloniranja
  • Naročnik - to definira potrošnika, ki lahko ustvari nov primerek s kloniranjem prototipa

Ob upoštevanju tega bomo tukaj izvedli vzorec prototipa z uporabo treh vrst. Sem spadajo naslednje:

  • Stranka
  • CustomerManager
  • Prototip kupca

Ustvarite prototip abstraktnega razreda v .NET

Glejte spodaj navedeni razred CustomerPrototype.

[Serializable ()]

javni abstraktni razred CustomerPrototype

    {

javni povzetek CustomerPrototype Clone (bool performDeepCopy);

    }

Razred CustomerPrototype je abstraktne narave in vsebuje eno abstraktno metodo z imenom Klon. Ta metoda sprejema logični parameter z imenom performDeepCopy. Če je parameter, ki mu je bil poslan, resničen, bo izvedel globoko kopijo, sicer plitvo kopijo.

Ustvarite konkreten prototipni razred v .NET

Sledi razred CustomerManager. Vsebuje slovar, ki v njem shranjuje primerke razreda Customer (gre le za drug razred POCO). Vsebuje tudi indeksator z imenom CustomerPrototype. Lastnost nastavitve indeksatorja se uporablja za shranjevanje podatkov v primerku Slovar z imenom stranke.

  javni razred CustomerManager

    {

stranke zasebnega slovarja = nov slovar ();

public CustomerPrototype this [int index]

        {

dobite {vrnitev strank [indeks]; }

set {customers.Add (indeks, vrednost); }

        }

    }

Ustvari prototipni odjemalski razred v .NET

Sledi razred kupcev. Vsebuje dve lastnosti, in sicer FirstName in LastName, ter dve metodi, Clone in DeepCopy.

[Serializable ()]

javni razred Naročnik: CustomerPrototype

    {

javni niz FirstName

        {

pripravi se;

        }

javni niz Priimek

        {

dobili; set;

        }

javno razveljavi Klon strankePrototype (bool deepClone)

        {

stikalo (deepClone)

            {

case true:

vrni this.DeepCopy (this) kot CustomerPrototype;

case false:

vrnite this.MemberwiseClone () kot CustomerPrototype;

privzeto:

vrni to.MemberwiseClone () kot CustomerPrototype;

            }

        }

zasebno T DeepCopy (T obj)

        {

// Tukaj napišite kodo za globinsko kopiranje.

        }

     }

V zgornjem seznamu kod sem preskočil izvorno kodo metode DeepCopy, saj je že na voljo v prejšnjem članku tukaj.

Ustvarite globoko kopijo predmeta v .NET

Naslednji delček kode ponazarja, kako lahko izkoristite razred CustomerManager, ki smo ga prej ustvarili, za globinsko kopiranje.

CustomerManager customerManager = nov CustomerManager ();

Skrbnik kupcaObj1 = novi kupec ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Skrbnik kupcaObj2 = nov kupec ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Stranka stranka = customerManager [0]. Kloniraj (true) kot stranka;

Upoštevajte, da smo za nastavitev globoke kopije kot parameter predali metodo »Clone«.

Ustvarite plitvo kopijo predmeta v .NET

Podobno lahko isti parameter kot »padec« posredujete isti metodi za izvedbo plitke kopije. Evo, kako lahko to dosežete.

Stranka stranka = customerManager [0]. Kloniraj (false) kot stranka;

Na koncu je tukaj še celotna koda metode Main za vašo referenco.

statična praznina Main (string [] args)

      {

CustomerManager customerManager = nov CustomerManager ();

Skrbnik kupcaObj1 = novi kupec ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Skrbnik kupcaObj2 = novi kupec ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Stranka stranka = customerManager [0]. Kloniraj (true) kot stranka;

Console.ReadKey ();

      }