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 ();
}