4

Factory Method パターンについて読んでいます。

ランタイムまたはその他の状態に基づいて実装をStoreFactory#getStore()返す、単一のファクトリ クラスがある場合を理解できます。Store

しかし、読むことから (たとえば、このリンク)、他のファクトリ クラスが拡張される抽象ファクトリ クラスを作成する人々の一般的なパターンがあるようです。

 public abstract class AbstractFactory {
     public abstract Store getStore(int store);
 }

 public class StoreFactoryA extends AbstractFactory {
     public Store getStore(int Store) {
         if(Store == 1) { return new MyStoreImplA(); }
         if(Store == 2) { return new MyStoreImplB(); }
     }
 }

 public class StoreFactoryB extends AbstractFactory {
     public Store getStore(int Store) {
         if(Store == 1) { return new MyStoreImplC(); }
         if(Store == 2) { return new MyStoreImplD(); }
     }
 }

 public class Runner {
    public static void main(String[] args) {
        AbstractFactory storeFactory = new StoreFactoryA();
        Store myStore = storeFactory.getStore(1);
    }
 }

私の例は不自然ですが、前述のリンクのモデルです。

この実装は、私にはニワトリの卵のように思えます。ファクトリ メソッド パターンを使用して、クライアント コードでクラス タイプを指定する必要をなくしますが、クライアント コードは使用する正しいファクトリを選択的に選択する必要がありStoreFactoryAますStoreFactoryB

ここで抽象クラスを使用する理由は何ですか?

4

4 に答える 4

4

残念ながら、あなたが読んでいるリンクは、パターンの現実的な例を示していません。実際、元のGoFデザインパターンに従って、このパターンは抽象ファクトリと呼ばれます(ファクトリメソッドは別のパターンです)。

抽象ファクトリパターンは、オブジェクトのファミリを作成できるファクトリがある場合に使用されます。たとえば、AbstractGUIFactoryメソッドcreateButton(), createWindow(), createTitleBarなどを持つことができます。次に、などのような具体的なファクトリがあり、それぞれが独自の方法でオブジェクトWindowsGUIFactory, MacGUIFactory, MotifGUIFactoryを生成します。Button, Window, TitleBar

ファクトリは、アプリケーションのある時点で(おそらく構成を使用して)1つの実装に設定され、オブジェクトを作成する必要がある場所でそのファクトリが使用されます。

デザインパターンを学んでいる場合は、古典的なGoFの本から始めるのが最善のアドバイスです。

于 2012-09-06T06:03:16.350 に答える
0

オブジェクトに実際のプロセスとタイミングの制御のマージンを与えながら、制御の反転によって拡張性と分離を実現します。

于 2012-09-06T05:43:16.227 に答える
0

このパターンは、特にテストに関して興味深いものになります。をクラスに注入AbstractFactoryし、クラスを変更する必要なく、さまざまな環境またはテスト用にさまざまな型を選択できるようになりました (ファクトリが共通のインターフェイスを共有する型を作成する場合)。

使用するクラスは、ファクトリの具体的な実装に依存する必要はなく、作成された型の実際の実装に依存する必要もありません。

于 2012-09-06T05:28:26.480 に答える
0

Factory メソッドを使用する場合、メソッドはまだオブジェクト内にあり、メソッドにアクセスするには正しいオブジェクトをインスタンス化する必要があります。達成できる唯一の抽象化は、Abstract クラスによるものです。

Factory Method パターンはこのように設計されています。おそらく、Factory Method よりも優れた抽象化を持つ、Abstract Factory パターンのようなものであると予想していました。

http://c2.com/cgi/wiki?AbstractFactoryVsFactoryMethod

于 2012-09-06T05:33:22.547 に答える