プロトタイプ
プロトタイプモード:あなたは、クラス指定されたプロセスを作成すると、プロトタイプモデルの使用に、非常に高価なまたは非常に複雑です。
私たちは、ゲームが動的に変な作成するときにゲームをプレイしますが、ときに奇妙なばらつく自身は、いくつかの信者を作成するヒーローが作成したさまざまなシナリオに基づいています。モンスターインスタンスの多種多様を作成し、ますます厄介になってきた、さまざまな状態と、その後のコンストラクタの詳細を置く、それが凝集見えませんでした。あなたは、単一の領域内のインスタンスのすべての詳細をカプセル化することができれば、コードから分離ハンドルモンスターの詳細は、実際に動的にインスタンスを作成する必要があるというコードを作成することが可能で、プログラムはかなりきれいになります。
既存のインスタンスをコピーして新しいインスタンスを作成するための原型パターン、クローン方法が一般的に用いられ、またはデシリアライズされます。
クラス図を設計します。
プロトタイプモデルは、3つの役割があります。
プロトタイプの役割:既存のインスタンスの定義方法を複製することは、新しいインスタンス(モンスター)を生成します。
特定の役割プロトタイプ既存のインスタンスのコピーの新たなインスタンスを生成するための実装(WellKnowMonster、DynamicGeneratedMonster)。
ユーザーの役割:レジストリを維持し、プロトタイプの正しいインスタンスを見つけるための方法を提供します。最後に、新しいインスタンスを得る方法が提供され、方法は、複製インスタンスの新しいインスタンスを委任するために使用されます。
実装コード:
①プロトタイプの役割
1 パブリック インターフェイスモンスター 2 { 3 パブリックモンスタークローン(); 4 }
②特定の役割のプロトタイプ
1つの パブリック クラスWellKnowMonster:モンスター 2 { 3 パブリックモンスタークローン() 4 { 5 モンスタークローン= JsonConvert.DeserializeObject <WellKnowMonster>(JsonConvert.SerializeObject(本))。 6 リターンクローン; 7 } 8 } 9 10 11 パブリック クラスDynamicGeneratedMonster:モンスター 12 { 13 公衆モンスタークローン() 14 { 15 モンスタークローン= JsonConvert.DeserializeObject <DynamicGeneratedMonster>(JsonConvert.SerializeObject(この)); 16 リターンクローン; 17 } 18 }
③ユーザーの役割
1つの パブリック クラスMonsterRegistry 2 { 3 辞書< 文字列、モンスター> monsterDic = 新しい辞書< 文字列、モンスター> (); 4 公共 ボイド RegisterMonster(文字列キー、モンスター){ 5 monsterDic.Add(キー、モンスター)。 6 } 7 パブリックモンスターGetMonster(文字列キー){ 8 モンスター= monsterDic [キー]。 9 リターンmonster.Clone()。 10 } 11 }
④テスト
利点:
1、顧客の新しいインスタンスを作成するための複雑さを隠します。
2、顧客は未知のタイプのオプションのオブジェクトを生成することができます。
図3は、特定の状況では、オブジェクトが新しいオブジェクトを作成するよりも効率的であるコピー。
用途および短所:
1、システムは多くの種類から新しいオブジェクトを作成する必要があり、複雑なクラス階層で、プロトタイプを検討してください。
2、時には非常に複雑なオブジェクトをコピーし、プロトタイプモデルを使用することの欠点。
訪問者
訪問者モード:あなたがオブジェクトの組み合わせとして、新たな機能を追加し、パッケージは重要ではありませんしたい場合には、それは訪問者の使用です。
顧客にレストラン内で、顧客は情報メニューを求められることがあります場合には(例えば、赤唐辛子など、味のような重いではありません)、さらにいくつかは、原料組成をお願いします。
我々は、我々は3ヶ所を変更する必要があり、新しいメニューよりも多くの場合には、2つの場所に新しいメソッドを追加する必要が新しいメソッドを追加する場合は、このデザインは、それぞれの場所に新しいメソッドを追加したいです。このケースでは、Visitorパターンを使用することができます。訪問者の組み合わせの各要素では、すべての状態は、コレクション内のオブジェクト。状態が収集されると、顧客は様々な操作の状態への訪問者を許可することができます。あなたは新しい機能が必要な場合には、限り、訪問者の強化が可能と。
実装コード:
①メニュー、メニュー項目GETSTATEインタフェースの定義方法を達成
1 パブリック インターフェースメニューコンポーネントの 2 { 3 公共 ボイドGETSTATEは(訪問者がヒット); 4。 } 5。 6。 7。 // メニュー 8。 パブリック クラスメニュー:メニューコンポーネントの 9 { 10 公共の 文字列 = displayInfo " ではない熱い、適度な味" ; 11。 公共 ボイドGETSTATE(ビジターヒット) 12は 、{ 13は visitor.Visit(この); 14 } 15 } 16 17 // 原料 18の パブリック クラス成分:メニューコンポーネント 19 { 20 公衆 ストリング displayInfo = " 不辣、偏咸" 。 21 パブリック ボイドGETSTATE(ビジタービジター) 22 { 23 visitor.Visit(本) 24 } 25 }
②訪問者は、訪問者がインタフェースタイプ]メニュー項目を使用して、インターフェイスを定義します
パブリック インターフェイスビジター { 公共 のボイド訪問(メニューメニュー)。 公共 のボイド訪問(原料成分)。 } クラスMenuVisitor:ビジター { 公共 のボイド訪問(メニューメニュー) { Console.WriteLineを(menu.displayInfo)。 } 公共 ボイド訪問(原材料成分) { Console.WriteLineを(ingredients.displayInfo)。 } }
③テスト
利点:
1は、構造自体を変更せずに、あなたが組み合わせのために、新たな運営体制に参加することができます。
2は、新たな操作が比較的容易であり、参加したいです。
図3は、オペレーションコードが一緒にある訪問者によって実行されます。
用途および短所:
ビジターパターンを使用した場合1、、パッケージには、クラスの組み合わせを中断します。
2、アクセスパターンの追加は各訪問のために必要に応じて、そのポートフォリオ構造への変更は、より難しいので。