誰かが私にこれら2つの違いを説明し、それぞれをいつ使用するかについてのある種のガイドラインを与えようとすることができますか?例は本当にいいでしょう。
3 に答える
INTENTは、構造と実装の詳細以外は異なります。意図が重要であるというこの基本的な考えを理解するとすぐに、あなたは正しい道を歩むことになります。
戦略の意図。これは行動パターンです
- アルゴリズムのファミリーを定義し、それぞれをカプセル化し、交換可能にします。戦略により、アルゴリズムは、それを使用するクライアントとは独立して変更できます。
- インターフェイスで抽象化をキャプチャし、実装の詳細を派生クラスに埋め込みます。
Abstract Factory の意図。これは創造的なパターンです
- 具象クラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供します。
- カプセル化する階層: 多くの可能な「プラットフォーム」、および一連の「製品」の構築。
ストラテジーは、ファーストクラスの関数を持たない言語の回避策です。残りのコードから分離したいポリシーを決定する戦略オブジェクトを渡します。Java での並べ替えと、それらが Comparator をどのように使用するかを考えてみてください。Comparator は、並べ替えアルゴリズムとは別に並べ替えのポリシーを指定できる戦略オブジェクトです。これにより、さまざまな戦略を取り込んでコードを再利用できます。
抽象ファクトリは、他のオブジェクトを作成するために使用されるオブジェクトです。抽象部分は、ファクトリの実装を返すファクトリがあり、ファクトリのユーザーがインターフェイスを介してアクセスします。したがって、ファクトリのユーザーはオブジェクトのインターフェイスのみに依存しているため、ファクトリのユーザーを変更することなく、あるファクトリの実装を別のファクトリの実装に交換できます。
ファクトリデザインパターンはファクトリとして機能し、要求に応じて実行時にさまざまな種類のオブジェクトを生成します。したがって、制御は実行時に行われ、実行時に必要なオブジェクトを決定することができます。したがって、オブジェクト間の結合が減少します。
一方、ストラテジーデザインパターンでは、「isa」関係よりも「hasa」関係を使用することで、階層構造をより適切に制御できます。より複雑なシナリオで継承(is a)を使用しようとすると、世代を超えて継承されたメソッドをオーバーライドする必要があり、コードの再利用が回避されるためです。
たとえば、Animalクラス(またはインターフェイス)を作成し、その中にmoveメソッドがあるとします。
そして、あなたはそれを拡張することによって鳥のクラスを作成することを望んでいます。したがって、move()メソッドの下にフライング機能を追加します。しかし、ペンギンの場合はどうですか?彼らはウォーキング機能を備えています。
したがって、Animalクラスを拡張して動物を作成するたびに、move()メソッドを何度もオーバーライドする必要があります。move()メソッドは変更に対してより脆弱であることを明確に理解できるため、ベストプラクティスは、変更部分をコアコードから分離することです。
単純に、move()メソッドに別の階層を作成できます。setterメソッドを使用して、関連するmove()メソッドをオブジェクトに割り当てることができます。したがって、制御は実行時に渡されます。次の図はその事実を示しています。
以下は私のブログ投稿の2つです。よろしければ、詳細を参照してください。