Jak używać wzorca projektowego prototypu w .NET
Wzorce projektowe służą do rozwiązywania powtarzających się problemów i złożoności w tworzeniu oprogramowania. Wzorzec prototypowy należy do kategorii kreacyjnych wzorców projektowych i służy do tworzenia klonu obiektu. Kreacyjne wzorce projektowe dotyczą tworzenia obiektów i zarządzania procesem tworzenia obiektów w aplikacji. Typowe przykłady wzorców projektowych, które należą do kategorii wzorców kreacyjnych, obejmują fabrykę abstrakcyjną, konstruktora, metodę fabryki, wzorce prototypowe i pojedyncze.
Wzorzec projektowy prototypu umożliwia utworzenie nowej instancji klasy na podstawie istniejącej instancji. Możesz skorzystać z tego wzorca projektowego, aby utworzyć klon obiektu, gdy sam proces tworzenia obiektu jest kosztowny. Zauważ, że klonowanie definiuje się jako proces tworzenia dokładnej kopii obiektu. Istnieją dwa rodzaje klonowania: głęboka kopia i płytka kopia.
Kopiowanie płytkie a klonowanie głębokich kopii
Płytka kopia jest wykonywana przy użyciu metody Object.MemberwiseClone i kopiuje niestatyczne pola obiektu, podczas gdy głęboka kopia służy do kopiowania zarówno typów referencyjnych, jak i wartościowych i zapewnia odrębne wystąpienie obiektu. Możesz dowiedzieć się więcej głębokiej i płytkiej kopii z mojego artykułu tutaj.
Uczestnicy (klasy i obiekty) w typowej implementacji wzorca prototypowego obejmują:
- Prototyp - definiuje interfejs do klonowania samego siebie
- ConcretePrototype - określa typ, który implementuje operację klonowania samego siebie
- Klient - definiuje konsumenta, który może utworzyć nową instancję poprzez klonowanie prototypu
Mając to na uwadze, zaimplementujemy tutaj wzorzec prototypowy przy użyciu trzech typów. Należą do nich:
- Klient
- CustomerManager
- CustomerPrototype
Utwórz prototypową klasę abstrakcyjną w .NET
Zapoznaj się z klasą CustomerPrototype podaną poniżej.
[Serializable ()]publiczna klasa abstrakcyjna CustomerPrototype
{
public abstract CustomerPrototype Clone (bool performDeepCopy);
}
Klasa CustomerPrototype ma charakter abstrakcyjny i zawiera jedną abstrakcyjną metodę o nazwie Clone. Ta metoda akceptuje parametr boolowski o nazwie performDeepCopy. Jeśli przekazany parametr jest prawdziwy, wykona głęboką kopię, w przeciwnym razie płytką kopię.
Utwórz konkretną klasę prototypową w .NET
Następnie podana jest klasa CustomerManager. Zawiera Dictionary, który przechowuje w nim instancje klasy Customer (to po prostu kolejna klasa POCO). Zawiera również indeksator o nazwie CustomerPrototype. Właściwość set indeksatora służy do przechowywania danych w wystąpieniu Dictionary o nazwie customers.
public class CustomerManager{
prywatni klienci Dictionary = new Dictionary ();
publiczny CustomerPrototype this [indeks int]
{
zdobądź {powracających klientów [indeks]; }
set {customers.Add (indeks, wartość); }
}
}
Utwórz prototypową klasę klienta w .NET
Następnie podano klasę klienta. Zawiera dwie właściwości, a mianowicie FirstName i LastName oraz dwie metody, Clone i DeepCopy.
[Serializable ()]klasa publiczna Klient: CustomerPrototype
{
publiczny ciąg FirstName
{
przygotować się;
}
publiczny ciąg LastName
{
dostać; zestaw;
}
public override CustomerPrototype Clone (bool deepClone)
{
przełącznik (deepClone)
{
sprawa prawdziwa:
zwróć this.DeepCopy (this) jako CustomerPrototype;
sprawa fałszywa:
zwraca this.MemberwiseClone () jako CustomerPrototype;
domyślna:
zwraca this.MemberwiseClone () jako CustomerPrototype;
}
}
prywatny T DeepCopy (T obj)
{
// Wpisz tutaj kod, aby wykonać głęboką kopię.
}
}
Pominąłem kod źródłowy metody DeepCopy w powyższej liście kodów, ponieważ jest już dostępny w moim wcześniejszym artykule tutaj.
Utwórz głęboką kopię obiektu w .NET
Poniższy fragment kodu ilustruje, w jaki sposób można wykorzystać stworzoną wcześniej klasę CustomerManager do wykonania głębokiej kopii.
CustomerManager customerManager = nowy CustomerManager ();Customer custObj1 = new Customer ();
custObj1.FirstName = "Joydip";
custObj1.LastName = "Kanjilal";
customerManager [0] = custObj1;
Customer custObj2 = new Customer ();
custObj2.FirstName = "Stephen";
custObj2.LastName = "Smith";
customerManager [1] = custObj2;
Klient customer = customerManager [0] .Clone (true) jako Customer;
Zauważ, że przekazaliśmy „true” jako parametr do metody Clone, aby wykonać głęboką kopię.
Utwórz płytką kopię obiektu w .NET
Podobnie, możesz przekazać „false” jako parametr do tej samej metody, aby wykonać płytką kopię. Oto, jak możesz to osiągnąć.
Klient customer = customerManager [0] .Clone (false) as Customer;
Wreszcie, oto pełny kod metody Main w celach informacyjnych.
static void Main (string [] args){
CustomerManager customerManager = nowy CustomerManager ();
Customer custObj1 = new Customer ();
custObj1.FirstName = "Joydip";
custObj1.LastName = "Kanjilal";
customerManager [0] = custObj1;
Customer custObj2 = new Customer ();
custObj2.FirstName = "Stephen";
custObj2.LastName = "Smith";
customerManager [1] = custObj2;
Klient customer = customerManager [0] .Clone (true) jako Customer;
Console.ReadKey ();
}