Programovanie

Ako používať prototypový vzor v .NET

Dizajnové vzory sa používajú na riešenie opakujúcich sa problémov a zložitostí pri vývoji softvéru. Prototypový vzor patrí do kategórie tvorivých dizajnových vzorov a slúži na vytvorenie klonu objektu. Tvorivé návrhové vzory sa zaoberajú vytváraním objektov a riadením procesu vytvárania objektov vo vašej aplikácii. Medzi typické príklady dizajnových vzorov, ktoré spadajú do kategórie tvorivých vzorov, patria abstraktná továreň, staviteľ, továrenská metóda, prototyp a jednotlivé vzory.

Prototypový návrhový vzor vám umožňuje vytvoriť novú inštanciu triedy z existujúcej inštancie. Tento dizajnový vzor môžete využiť na vytvorenie klonu objektu, keď je samotný proces vytvárania objektu nákladnou záležitosťou. Upozorňujeme, že klonovanie je definované ako proces vytvárania presnej kópie objektu. Existujú dva typy klonovania: hlboké kopírovanie a plytké kopírovanie.

Plytké kopírovanie vs. hlboké kopírovanie

Plytké kopírovanie sa vykonáva pomocou metódy Object.MemberwiseClone a kopíruje nestatické polia objektu, zatiaľ čo hlboké kopírovanie sa používa na kopírovanie referenčných aj hodnotových typov a poskytuje vám zreteľnú inštanciu objektu. Viac hlbokých a plytkých kópií sa môžete dozvedieť z môjho článku tu.

Medzi účastníkov (triedy a objekty) typickej implementácie prototypového vzoru patria:

  • Prototyp - definuje rozhranie pre samotné klonovanie
  • ConcretePrototype - definuje typ, ktorý implementuje operáciu pre samotné klonovanie
  • Klient - definuje spotrebiteľa, ktorý môže vytvoriť novú inštanciu klonovaním prototypu

Nezabúdajme na to, že tu implementujeme prototypový vzor pomocou troch typov. Medzi ne patria:

  • Zákazník
  • CustomerManager
  • Prototyp zákazníka

Vytvorte prototyp abstraktnej triedy v .NET

Pozrite si triedu CustomerPrototype uvedenú nižšie.

[Serializable ()]

verejná abstraktná trieda CustomerPrototype

    {

verejný abstrakt CustomerPrototype Clone (bool performDeepCopy);

    }

Trieda CustomerPrototype má abstraktnú povahu a obsahuje jednu abstraktnú metódu s názvom Clone. Táto metóda prijíma boolovský parameter s názvom performDeepCopy. Ak je odovzdaný parameter pravdivý, vykoná hĺbkovú kópiu, inak plytkú kópiu.

Vytvorte konkrétnu triedu prototypu v .NET

Ďalej je uvedená trieda CustomerManager. Obsahuje slovník, ktorý do nej ukladá inštancie triedy Customer (je to iba ďalšia trieda POCO). Obsahuje tiež indexátor s názvom CustomerPrototype. Vlastnosť set indexeru sa používa na ukladanie údajov do inštancie slovníka s názvom customers.

  verejná trieda CustomerManager

    {

zákazníci súkromného slovníka = nový slovník ();

public CustomerPrototype this [int index]

        {

získať {návrat zákazníkov [index]; }

set {customers.Add (index, value); }

        }

    }

Vytvorte prototyp klientskej triedy v .NET

Ďalej je uvedená zákaznícka trieda. Obsahuje dve vlastnosti, a to FirstName a LastName, a dve metódy, Clone a DeepCopy.

[Serializable ()]

verejná trieda Zákazník: CustomerPrototype

    {

verejný reťazec FirstName

        {

pripraviť sa;

        }

verejný reťazec Priezvisko

        {

dostať; sada;

        }

verejné prepísanie klonu CustomerPrototype (bool deepClone)

        {

prepínač (deepClone)

            {

prípad pravdivý:

vrátiť this.DeepCopy (this) ako CustomerPrototype;

nepravdivý prípad:

vrátiť this.MemberwiseClone () ako CustomerPrototype;

predvolené:

vrátiť this.MemberwiseClone () ako CustomerPrototype;

            }

        }

súkromné ​​T DeepCopy (T obj)

        {

// Sem napíšete kód, aby ste mohli vykonať hlbokú kópiu.

        }

     }

Vo vyššie uvedenom zozname kódov som preskočil zdrojový kód metódy DeepCopy, pretože je už k dispozícii v mojom staršom článku tu.

Vytvorte hlbokú kópiu objektu v .NET

Nasledujúci úryvok kódu ilustruje, ako môžete využiť triedu CustomerManager, ktorú sme vytvorili skôr, na vykonanie hĺbkovej kópie.

CustomerManager customerManager = nový CustomerManager ();

Zákazník custObj1 = nový Zákazník ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Zákazník custObj2 = nový Zákazník ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Zákazník zákazník = customerManager [0]. Klon (true) ako zákazník;

Upozorňujeme, že metóde Clone na vykonanie hĺbkovej kópie sme odovzdali parameter „true“.

Vytvorte plytkú kópiu objektu v .NET

Podobne môžete rovnakou metódou na vykonanie plytkej kópie zadať „false“ ako parameter. Takto to môžete dosiahnuť.

Zákazník zákazník = customerManager [0]. Klonovať (nepravdivo) ako zákazník;

Na záver je tu kompletný kód hlavnej metódy pre vašu referenciu.

static void Main (reťazec [] args)

      {

CustomerManager customerManager = nový CustomerManager ();

Zákazník custObj1 = nový Zákazník ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Zákazník custObj2 = nový Zákazník ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Zákazník zákazník = customerManager [0]. Klon (true) ako zákazník;

Console.ReadKey ();

      }

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