.NETでプロトタイプデザインパターンを使用する方法

デザインパターンは、ソフトウェア開発で繰り返し発生する問題や複雑さを解決するために使用されます。プロトタイプパターンは、作成デザインパターンカテゴリに属し、オブジェクトのクローンを作成するために使用されます。作成デザインパターンは、オブジェクトの作成と、アプリケーションでのオブジェクト作成プロセスの管理に関係しています。作成パターンカテゴリに分類されるデザインパターンの典型的な例には、抽象ファクトリ、ビルダー、ファクトリメソッド、プロトタイプ、およびシングルトンパターンが含まれます。

プロトタイプデザインパターンを使用すると、既存のインスタンスからクラスの新しいインスタンスを作成できます。オブジェクト作成プロセス自体にコストがかかる場合は、このデザインパターンを利用して、オブジェクトのクローンを作成できます。クローン作成は、オブジェクトの正確なコピーを作成するプロセスとして定義されていることに注意してください。クローン作成には、ディープコピーとシャローコピーの2種類があります。

浅いコピーと深いコピーのクローン作成

浅いコピーはObject.MemberwiseCloneメソッドを使用して実行され、オブジェクトの非静的フィールドをコピーしますが、深いコピーは参照型と値型の両方をコピーするために使用され、オブジェクトに個別のインスタンスを提供します。こちらの私の記事から、より深いコピーと浅いコピーを学ぶことができます。

プロトタイプパターンの一般的な実装の参加者(クラスとオブジェクト)には、次のものが含まれます。

  • プロトタイプ—これはそれ自体を複製するためのインターフェースを定義します
  • ConcretePrototype —これはそれ自体を複製するための操作を実装するタイプを定義します
  • クライアント—これは、プロトタイプのクローンを作成することで新しいインスタンスを作成できるコンシューマーを定義します

これを念頭に置いて、ここでは3つのタイプを使用してプロトタイプパターンを実装します。これらには次のものが含まれます。

  • お客様
  • 顧客マネージャー
  • CustomerPrototype

.NETでプロトタイプの抽象クラスを作成します

以下に示すCustomerPrototypeクラスを参照してください。

[Serializable()]

パブリック抽象クラスCustomerPrototype

    {{

        public abstract CustomerPrototype Clone(bool performDeepCopy);

    }

CustomerPrototypeクラスは本質的に抽象であり、Cloneという名前の1つの抽象メソッドが含まれています。このメソッドは、performDeepCopyという名前のブールパラメーターを受け入れます。渡されたパラメーターがtrueの場合、ディープコピーを実行し、それ以外の場合はシャローコピーを実行します。

.NETで具体的なプロトタイプクラスを作成する

次に、CustomerManagerクラスを指定します。これには、Customerクラス(これは単なる別のPOCOクラス)のインスタンスを格納する辞書が含まれています。また、CustomerPrototypeという名前のインデクサーも含まれています。インデクサーのsetプロパティは、customersという名前のDictionaryインスタンスにデータを格納するために使用されます。

  パブリッククラスCustomerManager

    {{

     プライベート辞書customers = new Dictionary();

        public CustomerPrototype this [int index]

        {{

            get {return Customers [index]; }

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

        }

    }

.NETでプロトタイプクライアントクラスを作成する

次に、Customerクラスを示します。これには、FirstNameとLastNameの2つのプロパティと、CloneとDeepCopyの2つのメソッドが含まれています。

[Serializable()]

    パブリッククラスCustomer:CustomerPrototype

    {{

        パブリック文字列FirstName

        {{

            get; set;

        }

        パブリック文字列LastName

        {{

            取得する; セットする;

        }

        パブリックオーバーライドCustomerPrototypeClone(bool deepClone)

        {{

            スイッチ(deepClone)

            {{

                真の場合:

                    this.DeepCopy(this)をCustomerPrototypeとして返します。

                ケースfalse:

                    this.MemberwiseClone()をCustomerPrototypeとして返します。

                デフォルト:

                    this.MemberwiseClone()をCustomerPrototypeとして返します。

            }

        }

        プライベートTDeepCopy(T obj)

        {{

           //ここにコードを記述してディープコピーを実行します。

        }

     }

上記のコードリストのDeepCopyメソッドのソースコードは、以前の記事ですでに利用可能であるため、スキップしました。

.NETでオブジェクトのディープコピーを作成する

次のコードスニペットは、前に作成したCustomerManagerクラスを利用してディープコピーを実行する方法を示しています。

CustomerManager customerManager = new CustomerManager();

顧客custObj1 = new Customer();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

顧客custObj2 = new Customer();

custObj2.FirstName = "スティーブン";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Customer customer = customerManager [0] .Clone(true)as Customer;

ディープコピーを実行するために、パラメータとして「true」をCloneメソッドに渡したことに注意してください。

.NETでオブジェクトの浅いコピーを作成する

同様に、同じメソッドにパラメータとして「false」を渡して、浅いコピーを実行することもできます。これを実現する方法は次のとおりです。

Customer customer = customerManager [0] .Clone(false)as Customer;

最後に、参照用のMainメソッドの完全なコードを次に示します。

static void Main(string [] args)

      {{

      CustomerManager customerManager = new CustomerManager();

      顧客custObj1 = new Customer();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      顧客custObj2 = new Customer();

      custObj2.FirstName = "スティーブン";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Customer customer = customerManager [0] .Clone(true)as Customer;

      Console.ReadKey();

      }