Programmering

Hvordan bruke prototypedesignmønsteret i .NET

Designmønstre brukes til å løse tilbakevendende problemer og kompleksitet i programvareutvikling. Prototypemønsteret tilhører kategorien kreasjonelle designmønstre og brukes til å lage en klon av et objekt. Kreasjonelle designmønstre er opptatt av oppretting av objekter og administrering av objektopprettingsprosessen i applikasjonen din. Typiske eksempler på designmønstre som faller inn under kategorien skapelsesmønstre inkluderer abstrakte fabrikker, byggmestere, fabrikkmetoder, prototype og singleton mønstre.

Prototypens designmønster lar deg lage en ny forekomst av en klasse fra en eksisterende forekomst. Du kan dra nytte av dette designmønsteret for å lage en klon av et objekt når selve gjenstandsprosessen er en kostbar affære. Merk at kloning er definert som prosessen med å lage en nøyaktig kopi av et objekt. Det er to typer kloning: dyp kopi og grunne kopi.

Grunn kopi vs. dyp kopi kloning

Grunn kopi utføres ved hjelp av Object.MemberwiseClone-metoden og kopierer de ikke-statiske feltene til et objekt, mens dyp kopi brukes til å kopiere både referanse- og verdityper og gir deg en tydelig forekomst på et objekt. Du kan lære mer dyp kopi og grunne kopi fra artikkelen min her.

Deltakerne (klasser og objekter) i en typisk implementering av prototypemønsteret inkluderer følgende:

  • Prototype - dette definerer et grensesnitt for å klone seg selv
  • ConcretePrototype - dette definerer en type som implementerer operasjonen for å klone seg selv
  • Klient - dette definerer forbrukeren som kan opprette en ny forekomst ved å klone en prototype

Med dette i bakhodet vil vi implementere prototypemønsteret her ved hjelp av tre typer. Disse inkluderer følgende:

  • Kunde
  • CustomerManager
  • CustomerPrototype

Lag en prototype abstrakt klasse i .NET

Se klassen CustomerPrototype gitt nedenfor.

[Serialiserbar ()]

offentlig abstrakt klasse CustomerPrototype

    {

offentlig abstrakt CustomerPrototype Clone (bool performDeepCopy);

    }

CustomerPrototype-klassen er abstrakt og inneholder en abstrakt metode som heter Clone. Denne metoden godtar en boolsk parameter som heter performDeepCopy. Hvis parameteren som sendes til den, er sant, vil den utføre en dyp kopi, grunne kopier ellers.

Lag en konkret prototypeklasse i .NET

CustomerManager-klassen blir gitt neste. Den inneholder en ordbok som lagrer forekomster av kundeklassen (det er bare en annen POCO-klasse) i den. Den inneholder også en indekserer som heter CustomerPrototype. Den angitte egenskapen til indeksøren brukes til å lagre data i ordboksforekomsten som heter kunder.

  offentlig klasse CustomerManager

    {

private ordbokskunder = ny ordbok ();

offentlig kundePrototype denne [int-indeksen]

        {

få {retur kunder [indeks]; }

sett {kunder.Add (indeks, verdi); }

        }

    }

Opprett en prototype klientklasse i .NET

Kundeklassen blir gitt neste. Den inneholder to egenskaper, nemlig FirstName og LastName, og to metoder, Clone og DeepCopy.

[Serialiserbar ()]

offentlig klasse Kunde: CustomerPrototype

    {

offentlig streng Fornavn

        {

klar;

        }

offentlig streng Etternavn

        {

få; sett;

        }

offentlig overstyring CustomerPrototype Clone (bool deepClone)

        {

bryter (deepClone)

            {

tilfelle sant:

returner dette.DeepCopy (dette) som CustomerPrototype;

sak falsk:

returner dette.MemberwiseClone () som CustomerPrototype;

misligholde:

returner dette.MemberwiseClone () som CustomerPrototype;

            }

        }

privat T DeepCopy (T obj)

        {

// Skriv kode her for å utføre dyp kopi.

        }

     }

Jeg har hoppet over kildekoden til DeepCopy-metoden i kodelisten ovenfor, da den allerede er tilgjengelig i min tidligere artikkel her.

Lag en dyp kopi av et objekt i .NET

Følgende kodebit illustrerer hvordan du kan dra nytte av CustomerManager-klassen vi opprettet tidligere for å utføre en dyp kopi.

CustomerManager customerManager = ny CustomerManager ();

Kunden custObj1 = ny kunde ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Kunden custObj2 = ny kunde ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Kundekunde = customerManager [0] .Clone (true) som kunde;

Merk at vi har gitt "true" som parameter til Clone-metoden for å utføre en dyp kopi.

Lag en grunne kopi av et objekt i .NET

På samme måte kan du sende "falsk" som parameter til samme metode for å utføre en grunne kopi. Slik kan du oppnå dette.

Kundekunde = customerManager [0] .Clone (false) som kunde;

Til slutt, her er den komplette koden til hovedmetoden for din referanse.

statisk tomrom Main (streng [] args)

      {

CustomerManager customerManager = ny CustomerManager ();

Kunden custObj1 = ny kunde ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Kunden custObj2 = ny kunde ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Kundekunde = customerManager [0] .Clone (true) som kunde;

Console.ReadKey ();

      }

$config[zx-auto] not found$config[zx-overlay] not found