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

      }