概要
プロトタイプ パターンは、コードをオブジェクトが属するクラスに依存させることなく、既存のオブジェクトをコピーできるようにする創造的なデザイン パターンです。新しいオブジェクトは、毎回再作成するのではなく、プロトタイプ パターンを通じて既存のオブジェクトをコピーすることで取得できます。
プロトタイプ モードには次の役割が含まれます。
- 抽象プロトタイプ クラス: 特定のプロトタイプ オブジェクトが実装する必要がある clone() メソッドを指定します。
- 具象プロトタイプ クラス: コピー可能なオブジェクトである抽象プロトタイプ クラスの clone() メソッドを実装します。
- アクセス クラス: 具体的なプロトタイプ クラスの clone() メソッドを使用して、新しいオブジェクトをコピーします。
場合
インターフェースの紹介
public interface IResume
{
//填写资料
void SetPersonInfo(int age, string sex);
//打印资料
void Display();
//克隆方法
object Clone();
}
コンクリートクラス
public class Resume : IResume
{
private string name;
private int age;
private string sex;
// 构造函数:初始化姓名
public Resume(string name)
{
this.name = name;
}
// 填写个人信息
public void SetPersonInfo(int age, string sex)
{
this.age = age;
this.sex = sex;
}
//打印
public void Display()
{
Console.WriteLine("姓名:" + name);
Console.WriteLine("年龄:" + age + ",性别:" + sex);
}
// 克隆该实例
public object Clone()
{
return MemberwiseClone() as Resume;
}
}
テスト
シミュレーションでは、Ahao のプロファイルを作成し、それをオブジェクト B にクローンし、オブジェクト B の年齢を変更します。
public static void Main(string[] args)
{
//创建原型A对象
Resume a = new Resume("阿豪");
a.SetPersonInfo(18, "男");
//克隆给B对象
Resume b = a.Clone() as Resume;
//修改B对象的内容
b.SetPersonInfo(20, "男");
Console.WriteLine("----------------A--------------");
a.Display();
Console.WriteLine("----------------B--------------");
b.Display();
}
クローンオブジェクトと元のオブジェクトを比較してみましょう
// 测试A==B?
// 对任何的对象x,都有x.clone() !=x,即克隆对象与原对象不是同一个对象
Console.Write("A==B ? ");
Console.WriteLine(a == b);
// 对任何的对象x,都有x.clone().GetType()==x.GetType(),即克隆
Console.Write("A.GetType()==B.GetType() ? ");
Console.WriteLine(a.GetType() == b.GetType());
要約する
プロトタイプパターンの利点:
- プロトタイプ モードは、クラスのコンストラクターを呼び出さずにメモリ内のオブジェクトをコピーするため、優れたパフォーマンスを発揮します。
- 作成プロセスが簡素化されました。クラスの初期化で大量のリソースが消費される場合、プロトタイプをコピーすることで初期化プロセスの繰り返しを回避できます。
- コンストラクターの制約を回避できます。既存のインスタンスのデータを保存するには、既存のインスタンスをコピーすると効果的です。
- 商品カテゴリの追加や削除は非常に便利です。作成者が変わったからといってクライアントが変わる必要はありません。
プロトタイプ パターンの欠点:
- 各クラスはクローンメソッドを使用して構成する必要があります
- clone メソッドはクラス内にあるため、既存のクラスを変更する場合はコードを変更する必要があり、開始と終了の原則に違反します。
- ディープ コピーを実装する場合は、より複雑なコードを記述する必要があります。また、オブジェクト間に複数のネストされた参照がある場合、ディープ コピーを実装するには、各レイヤーがディープ コピーの実装メソッドを提供する必要があります。
- クローンオブジェクトの正確性は、特に実行時に状態が変化する場合に維持する必要があります。