FactoryとStrategyパターンの違いは何ですか?


回答:


226

ファクトリー・パターンは創造的なパターンです。戦略パターンは運用パターンです。言い換えれば、ファクトリパターンは特定のタイプのオブジェクトを作成するために使用されます。戦略パターンは、特定の方法で操作(または操作のセット)を実行するために使用されます。古典的な例では、ファクトリーはさまざまなタイプの動物(犬、猫、虎)を作成し、戦略パターンは特定のアクション(移動など)を実行します。ラン、ウォーク、またはロープ戦略を使用します。

実際、この2つは一緒に使用できます。たとえば、ビジネスオブジェクトを作成するファクトリがあるとします。永続化メディアに基づいて異なる戦略を使用する場合があります。データがローカルでXMLに格納されている場合、1つの戦略が使用されます。データが別のデータベースのリモートにある場合は、別のデータベースを使用します。


1
`戦略パターンは、特定の方法で操作(または操作のセット)を実行するために使用されます`オブジェクトに対する操作を意味しますか?
OPV

32

戦略パターンを使用すると、クラスの動作を多態的に変更できます。

ファクトリパターンを使用すると、オブジェクトの作成をカプセル化できます。

ゲイリーは素晴らしいポイントを作ります。「具体化」ではなく抽象化へのコーディングの原則を使用している場合、多くのパターンはテーマのバリエーションのように見えます。


25

tvanfossonの発言に加えて、多くのパターンは実装に関しては同じに見えます。つまり、多くの場合、コードに以前はなかったインターフェイスを作成してから、そのインターフェイスの実装の束を作成します。違いは、目的と使用方法にあります。


13
  • ファクトリー(メソッド)パターン。

具象インスタンスのみを作成します。引数が異なると、オブジェクトが異なる可能性があります。ロジック等により異なります。

  • 戦略パターン。

アルゴリズム(steps)をカプセル化してアクションを実行します。したがって、戦略を変更して別のアルゴリズムを使用できます。

どちらも非常によく似ていますが、目的はかなり異なります。1つはアクションを作成すること、もう1つはアクションを実行することです。

そう。Factoryメソッドが修正されている場合は、次のようになります。

 public Command getCommand( int operatingSystem ) { 
      switch( operatingSystem ) { 
           case UNIX    :
           case LINUX   : return new UnixCommand();
           case WINDOWS : return new WindowsCommand();
           case OSX     : return new OSXCommand();
       }
  }

ただし、工場でより高度な動的な作成が必要だとします。ファクトリメソッドに戦略を追加して、再コンパイルせずに変更できます。戦略は実行時に変更される可能性があります。


私はあなたがここで正しい主張をしているとは思わない。まず、これらのパターンの理由の1つは、多態性を支持する条件文を回避することです。最初に、単純なファクトリと抽象ファクトリの違いを作成する必要があります。最初の1つは、オブジェクト作成のファクトリとして機能するクラスが1つしかない単純なファクトリです。後者では、インターフェイスに接続して呼び出します。いくつかの基準に基づいて同じメソッドの異なる実装を持つことが想定されている、このインターフェースを実装する異なるファクトリ。(続く)
interboy

4
この場合は厳密に、一種の戦略パターンになりますが、操作ではなくオブジェクトの作成に使用されるため、意味的には異なります。したがって、基本的にはさまざまな戦略を使用してオブジェクトを作成できます。
interboy 2013年

2
@OscarRyz両方を説明するプログラムで回答を更新していただけますか
Prakash Pandey 2017

11

まず最初に、単純なファクトリーと抽象的なファクトリーの違いを作らなければなりません。最初のものは、オブジェクト作成のファクトリーとして機能するクラスが1つしかない単純なファクトリーです。後者では、ファクトリーインターフェース(メソッド名を定義する)に接続し、このインターフェースを実装するさまざまなファクトリーを呼び出します。いくつかの基準に基づいて、同じメソッドの異なる実装を持つことになっています。たとえば、最初のWindowsButtonCreationFactory(Windowsのルックアンドフィールでボタンを作成)と2番目のLinuxButtonCreationFactory(Linuxのルックアンドフィールでボタンを作成)の2つのファクトリによって実装されるButtonCreationFactoryインターフェイスがあります。したがって、これらの両方のファクトリは、異なる実装(アルゴリズム)で同じ作成メソッドを持っています。

たとえば、Linuxのルックアンドフィールのボタンが必要な場合:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);

または、Windowsボタンが必要な場合

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);

まさにこの場合、何らかの作成を行うためのアルゴリズムを区別するため、一種の戦略パターンになります。ただし、操作アルゴリズムではなくOBJECT CREATIONに使用されるため、意味的に異なります。したがって、基本的に抽象ファクトリーでは、さまざまな戦略を使用してオブジェクトを作成するため、戦略パターンと非常によく似ています。ただし、抽象パターンは創造的であり、戦略パターンは機能しています。実装に関しては、結果は同じになります。


10

Factory(およびFactoryによって返されるFactoryMethod)

  1. 創造的なパターン
  2. 継承に基づく
  3. FactoryはFactoryメソッド(インターフェース)を返し、それが今度は具象オブジェクトを返します
  4. インターフェースの代わりに新しい具象オブジェクトを使用できます。クライアント(呼び出し元)は、すべての具象実装を認識していません。
  5. クライアントは常にインターフェイスにのみアクセスし、ファクトリメソッドでオブジェクト作成の詳細を非表示にすることができます

このウィキペディアの記事javarevisitedの記事ご覧ください

戦略パターン:

  1. それは行動パターンです
  2. 委任に基づいています
  3. メソッドの動作を変更することにより、オブジェクトの根性を変更します
  4. アルゴリズムのファミリーを切り替えるために使用されます
  5. 実行時にオブジェクトの動作を変更します

例:

特定のアイテム(AirFareチケットまたはShoppingCartアイテム)の割引戦略を構成できます。この例では、7月から12月までのアイテムに25%の割引を提供し、1月から6月までのアイテムには割引を適用しません。

関連記事:

戦略パターンの実例

デザインパターン:ファクトリvsファクトリメソッドvs抽象ファクトリ


3

オスカーが言ったことを拡張し、彼のコードを参照するには:

getCommandはファクトリであり、UnixCommand、WindowsCommandおよびOSXCommandクラスは戦略です


3

簡単な用語での戦略パターンは、実装するクラスに関係のない動作の実行時作成の詳細です。もう1つは、具象クラスインスタンスのランタイム作成であり、実装されたインターフェイスによって公開された動作(メソッド)を使用するかどうかはユーザー次第でした。


2

コードやカテゴリを見ただけでは違いがわかりません。GoFパターンを正しく把握するには、その意図を探します。

戦略:「アルゴリズムのファミリーを定義し、それぞれをカプセル化し、それらを交換可能にします。戦略により、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変えることができます。」

ファクトリメソッド:「オブジェクトを作成するためのインターフェースを定義しますが、インスタンス化するクラスはサブクラスに決定させます。ファクトリメソッドは、クラスがインスタンス化をサブクラスに遅延させるようにします。」

そして、ここにこれらの2つのパターンの意図と違いについての入念な説明があります:ファクトリーメソッドとストラテジーのデザインパターンの違い


1

ファクトリー実装の彼の例はかなり緊密に結合されており、非常に閉じているという点で、オスカーとは一言かもしれません。あなたの選択が戦略パターンであることも不思議ではありません。Factoryの実装は、インスタンス化される特定のクラスの固定数に依存してはなりません。次に例を示します。

public Command getCommand( int operatingSystem ) {        
   return commandTable.get(operatingSystem); 
}

...

public class WindowsCommand implements Command {
    ...
    static {
        CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
    }

}

どちらかを選択するのに最も適切な基準は、クラスとメソッドに名前を付けるために使用する用語であり、クラスではなくインターフェイスにプログラムする傾向があり、また目標に焦点を当てる必要があることを考慮します。実行時に実行されるコード。つまり、両方のパターンのいずれかを使用することで、目標を達成できます。


1

戦略と工場は異なる目的です。戦略ではアプローチを定義し、このパターンを使用して動作(アルゴリズム)を交換できます。工場に来ると周りのバリエーションがたくさんあります。しかし、GO4の元のパターンでは、ファクトリはオブジェクトの作成を子クラスに残しています。ここで、ファクトリでは、関心のある動作ではなく、完全なインスタンスを置き換えます。これにより、アルゴリズムではなく、完全なシステムを置き換えます。


0

ファクトリパターンは、指定されたプロパティ(動作)で作成される作成パターンです。実行時の作成後は、プロパティ(動作)を変更できません。したがって、異なるプロパティが必要な場合(動作)、オブジェクトを削除して、必要なプロパティを持つ新しいオブジェクトを作成する必要があります(動作)。ガッドではありません。一方、戦略パターンの場合、uは実行時にプロパティ(動作)を変更できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.