Programování

Jak používat vzor návrhu prototypu v .NET

Návrhové vzory se používají k řešení opakujících se problémů a složitostí při vývoji softwaru. Prototypový vzor patří do kategorie kreačních návrhových vzorů a slouží k vytvoření klonu objektu. Vytváření návrhových vzorů se týká vytváření objektů a správy procesu vytváření objektů ve vaší aplikaci. Typické příklady návrhových vzorů, které spadají do kategorie kreačních vzorů, zahrnují abstraktní továrnu, stavitele, tovární metodu, prototyp a singletonové vzory.

Návrhový vzor prototypu umožňuje vytvořit novou instanci třídy z existující instance. Tento návrhový vzor můžete využít k vytvoření klonu objektu, když je samotný proces vytváření objektu nákladnou záležitostí. Všimněte si, že klonování je definováno jako proces vytváření přesné kopie objektu. Existují dva typy klonování: hluboká kopie a mělká kopie.

Mělké kopírování vs. hluboké kopírování

Mělké kopírování se provádí pomocí Object.MemberwiseClone metody a kopíruje nestatická pole objektu, zatímco hluboká kopie se používá ke kopírování jak referenčních, tak hodnotových typů a poskytuje vám odlišnou instanci objektu. Zde se můžete dozvědět více hlubokých a mělkých kopií z mého článku.

Mezi účastníky (třídy a objekty) typické implementace prototypového vzoru patří následující:

  • Prototyp - definuje rozhraní pro samotné klonování
  • ConcretePrototype - definuje typ, který implementuje operaci pro samotné klonování
  • Klient - toto definuje spotřebitele, který může vytvořit novou instanci klonováním prototypu

S ohledem na to zde implementujeme prototypový vzor pomocí tří typů. Patří mezi ně následující:

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

Vytvořte prototyp abstraktní třídy v .NET

Viz třída CustomerPrototype uvedená níže.

[Serializable ()]

veřejná abstraktní třída CustomerPrototype

    {

public abstract CustomerPrototype Clone (bool performDeepCopy);

    }

Třída CustomerPrototype má abstraktní povahu a obsahuje jednu abstraktní metodu s názvem Clone. Tato metoda přijímá logický parametr s názvem performDeepCopy. Pokud je předaný parametr true, provede hlubokou kopii, jinak mělkou kopii.

Vytvořte konkrétní třídu prototypu v .NET

Dále je uvedena třída CustomerManager. Obsahuje slovník, který do ní ukládá instance třídy Customer (je to jen další třída POCO). Obsahuje také indexer s názvem CustomerPrototype. Vlastnost set indexeru se používá k ukládání dat do instance Dictionary s názvem customers.

  veřejná třída CustomerManager

    {

zákazníci soukromého slovníku = nový slovník ();

public CustomerPrototype this [int index]

        {

získejte {návrat zákazníků [index]; }

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

        }

    }

Vytvořte prototyp klientské třídy v .NET

Dále je uvedena třída Zákazník. Obsahuje dvě vlastnosti, jmenovitě FirstName a LastName, a dvě metody, Clone a DeepCopy.

[Serializable ()]

veřejná třída Zákazník: CustomerPrototype

    {

veřejný řetězec FirstName

        {

dostat; nastavit;

        }

veřejný řetězec Příjmení

        {

dostat; soubor;

        }

veřejné přepsání klonu CustomerPrototype (bool deepClone)

        {

přepínač (deepClone)

            {

případ pravdivý:

vrátit this.DeepCopy (this) jako CustomerPrototype;

případ false:

vrátit this.MemberwiseClone () jako CustomerPrototype;

výchozí:

vrátit this.MemberwiseClone () jako CustomerPrototype;

            }

        }

soukromá T DeepCopy (T obj)

        {

// Sem napište kód pro provedení hlubokého kopírování

        }

     }

Ve výše uvedeném seznamu kódů jsem přeskočil zdrojový kód metody DeepCopy, protože je již k dispozici v mém dřívějším článku zde.

Vytvořte hlubokou kopii objektu v .NET

Následující fragment kódu ukazuje, jak můžete využít třídu CustomerManager, kterou jsme vytvořili dříve, k provedení hloubkové kopie.

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) jako zákazník;

Všimněte si, že jsme předali „true“ jako parametr metodě Clone k provedení hluboké kopie.

Vytvořte mělkou kopii objektu v .NET

Podobně můžete předat „false“ jako parametr stejné metodě k provedení mělké kopie. Tady můžete dosáhnout.

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

Konečně je zde kompletní kód hlavní metody pro vaši referenci.

static void Main (řetězec [] 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) jako zákazník;

Console.ReadKey ();

      }

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