私が理解しているように:
抽象ファクトリ パターンは、オブジェクトのファミリを作成するためのインターフェイスを提供しますが、ファクトリ メソッドは、1 つのオブジェクトを作成するためのインターフェイスを提供します。
これがこれらのパターンの違いだけである場合、なぜそれらが別々に考慮されているのですか?
私が理解しているように:
抽象ファクトリ パターンは、オブジェクトのファミリを作成するためのインターフェイスを提供しますが、ファクトリ メソッドは、1 つのオブジェクトを作成するためのインターフェイスを提供します。
これがこれらのパターンの違いだけである場合、なぜそれらが別々に考慮されているのですか?
これら2つのパターンの定義を振り返ると、次のことがわかります。
ファクトリメソッドは、オブジェクトを作成するためのインターフェイスを定義するために使用されますが、インスタンス化するクラスをサブクラスに決定させます。ファクトリメソッドを使用すると、クラスはインスタンス化をサブクラスに延期できます。」
抽象ファクトリは、具体的なクラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供するために使用されます。
だからあなたが言ったことは正しいです。ファクトリメソッドは(通常)1つのオブジェクトの作成に関係しますが、抽象ファクトリはいくつかの関連オブジェクトに関係します。
しかし、それだけではありません。それぞれの意図で太字にした2番目の単語を見ると、各パターンが機能するメカニズムに関して、別の違いがあることがわかります。
Factory Methodは、SUBCLASSESと継承を使用して、インスタンス化を具体的な実装に委任します。つまり、新しい製品を作成するには、「creator」クラスを継承し、factoryメソッドをオーバーライドする必要があります。このファクトリメソッドは、次に、必要な製品を返します。
一方、Abstract Factoryは、オブジェクトコンポジション(つまりファクトリ)を使用して委任します。作成者クラスではなく、「製品」クラスでコードを変更する必要があります。具体的には、製品クラス内で、いくつかの関連製品(製品の成分など)を定義します。各製品は、ファクトリOBJECT(製品クラスで構成され、実行時に渡される)を使用して作成できます。この場合の作成者クラスは、抽象製品のみを作成し、製品が使用するファクトリをその製品に渡します。
ただし、少し混乱させるために、AbstractFactoryの中央の抽象ファクトリは通常ファクトリメソッドを実装しています。この中央工場は、多くの場合、すべての原料に対して一連のファクトリメソッドを定義し、各原料の作成をコンクリート工場に委任します。
それが役に立てば幸い。多くのデザインパターンは本当に似ており、実際には関連していることを忘れないでください。たとえば、デコレータパターンとアダプタパターンを見てください。ほとんどの場合、2つのデザインパターンの違いはそれぞれの意図にあります。ちなみに、私が本当に気に入っているデザインパターンに関する良い本は、Head FirstDesignPatternです。そして、ここに投稿された同様の質問があります。
ファクトリ メソッドは固定されています。実行時に変更することはできません。
抽象ファクトリを使用すると、いくつかの基準に応じて、実行時に選択できる別のファクトリでオブジェクトを作成できます。
Button button = WinButtonFactory.create(); //will always be a "windows button"
Button button = buttonFactory.create();
2番目のように、これはWinButtonFactory extends ButtonFactory
またはになることができますMacOSXButtonFactory extends ButtonFactory
。現在の OS に応じて、どちらか一方を渡すことができます。
抽象ファクトリパターンとは、ファクトリ(具体的な実装)用のファクトリを持つことを意味します。