2

Abstract Factory と Factory デザイン パターンの違いは、AbstractFactory パターンはコンポジションを使用してオブジェクトを作成する責任を別のクラスに委任するのに対し、Factory デザイン パターンは継承を使用し、派生クラスまたはサブクラスに依存してオブジェクトを作成することです。

以下は、抽象ファクトリの典型的な例です ( http://www.oodesign.com/abstract-factory-pattern.html ) 抽象ファクトリがオブジェクト構成を使用している場所を説明してもらえますか?

abstract class AbstractProductA{
public abstract void operationA1();
public abstract void operationA2();
}

class ProductA1 extends AbstractProductA{
    ProductA1(String arg){
        System.out.println("Hello "+arg);
    } // Implement the code here
    public void operationA1() { };
    public void operationA2() { };
}

class ProductA2 extends AbstractProductA{
    ProductA2(String arg){
        System.out.println("Hello "+arg);
    } // Implement the code here
    public void operationA1() { };
    public void operationA2() { };
}

abstract class AbstractProductB{
    //public abstract void operationB1();
    //public abstract void operationB2();
}

class ProductB1 extends AbstractProductB{
    ProductB1(String arg){
        System.out.println("Hello "+arg);
    } // Implement the code here
}

class ProductB2 extends AbstractProductB{
    ProductB2(String arg){
        System.out.println("Hello "+arg);
    } // Implement the code here
}

abstract class AbstractFactory{
    abstract AbstractProductA createProductA();
    abstract AbstractProductB createProductB();
}

class ConcreteFactory1 extends AbstractFactory{
    AbstractProductA createProductA(){
        return new ProductA1("ProductA1");
    }
    AbstractProductB createProductB(){
        return new ProductB1("ProductB1");
    }
}

class ConcreteFactory2 extends AbstractFactory{
    AbstractProductA createProductA(){
        return new ProductA2("ProductA2");
    }
    AbstractProductB createProductB(){
        return new ProductB2("ProductB2");
    }
}

ConcreteFactory1私はサブクラスを理解ConcreteFactory1し、オブジェクトをクライアントに返しています。通常、複数の製品を持つ Factory クラスとして機能します。

クライアントコードがどこにあるのか

AbstractFactory factory = new ConcreteFactory2();
AbstractProductA prodA = factory.createProductA();

抽象ファクトリのどこでオブジェクトの構成/委任が行われるのか説明してもらえますか?

4

2 に答える 2

3

この文を取り上げて、それが何であるかを考えてみましょう。

AbstractFactory パターンは合成を使用して、オブジェクトを作成する責任を別のクラスに委任します

抽象ファクトリーは、 「ファクトリー・パターンのファクトリー」と呼ぶことができます。ここにもう 1 つのクラスがあり、それを呼び出して、リクエストのタイプに応じて複数のファクトリFactoryOfFactory作成/保持し、最終製品を返します。

class FactoryOfFactory {

   enum Type { P1, P2}

   public AbstractProductA createProductA(Type t) {
        switch(t) {
            case P1:
               return new ConcreteFactory1().createProductA();
            case P2:
               return new ConcreteFactory2().createProductA();
            ....
        }
   }

   public AbstractProductB createProductB(Type t) {
         switch(t) {
            case P1:
               return new ConcreteFactory1().createProductB();
            case P2:
               return new ConcreteFactory2().createProductB();
            ....
        }
   }

}

コンポジションの定義は

合成は集計の特殊なケースです。より具体的には、制限された集合体を合成と呼びます。オブジェクトが他のオブジェクトを含む場合、含まれるオブジェクトがコンテナオブジェクトの存在なしでは存在できない場合、それは合成と呼ばれます。

ここで、コンテナはあり、含まれるオブジェクトはなどのFactoryOfFactoryFactory クラスの異なる実装です。リクエストをそれぞれのファクトリ実装に委譲します。ConcreteFactory1ConcreteFactory2FactoryOfFactoryType

于 2013-07-11T06:26:24.990 に答える