1. 概要

この記事では、AbstractFactoryのデザインパターンについて説明します。

デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素抽象ファクトリは 「具象クラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリーを作成するためのインターフェースを提供します」。 つまり、このモデルを使用すると、一般的なパターンに従うオブジェクトを作成できます。

JDKのAbstractFactoryデザインパターンの例は、 javax.xml.parsers.DocumentBuilderFactoryクラスのnewInstance()です。

2. 抽象ファクトリデザインパターンの例

この例では、ファクトリメソッドデザインパターンの2つの実装を作成します。 AnimalFactory工場。

その後、Abstract Factory AbstractFactory:を使用してそれらへのアクセスを管理します。

最初に、 Animal クラスのファミリーを作成し、後でそれをAbstractFactoryで使用します。

Animalインターフェースは次のとおりです。

public interface Animal {
    String getAnimal();
    String makeSound();
}

および具体的な実装Duck

public class Duck implements Animal {

    @Override
    public String getAnimal() {
        return "Duck";
    }

    @Override
    public String makeSound() {
        return "Squeks";
    }
}

さらに、この方法で Animal インターフェイス( Dog、Bear、など)のより具体的な実装を作成できます。

抽象ファクトリは、依存オブジェクトのファミリを扱います。 そのことを念頭に置いて、いくつかの実装(ホワイト、ブラウン、…)を備えたインターフェイスとして、もう1つのファミリカラーを紹介します。

ここでは実際のコードをスキップしますが、ここにあります。

複数のファミリの準備ができたので、それらのAbstractFactoryインターフェイスを作成できます。

public interface AbstractFactory<T> {
    T create(String animalType) ;
}

次に、前のセクションで説明したファクトリメソッドデザインパターンを使用して、AnimalFactoryを実装します。

public class AnimalFactory implements AbstractFactory<Animal> {

    @Override
    public Animal create(String animalType) {
        if ("Dog".equalsIgnoreCase(animalType)) {
            return new Dog();
        } else if ("Duck".equalsIgnoreCase(animalType)) {
            return new Duck();
        }

        return null;
    }

}

同様に、同じデザインパターンを使用して、Colorインターフェイスのファクトリを実装できます。

これがすべて設定されたら、 FactoryProvider クラスを作成します。このクラスは、提供する引数に応じてAnimalFactoryまたはColorFactoryの実装を提供します。 getFactory()メソッド:

public class FactoryProvider {
    public static AbstractFactory getFactory(String choice){
        
        if("Animal".equalsIgnoreCase(choice)){
            return new AnimalFactory();
        }
        else if("Color".equalsIgnoreCase(choice)){
            return new ColorFactory();
        }
        
        return null;
    }
}

3. 抽象ファクトリパターンを使用する場合:

  • クライアントは、システムでオブジェクトを作成および構成する方法に依存しません
  • システムはオブジェクトの複数のファミリで構成されており、これらのファミリは一緒に使用するように設計されています
  • 特定の依存関係を構築するには、実行時の値が必要です

事前定義されたオブジェクトを作成するときのパターンは素晴らしいですが、新しいオブジェクトを追加するのは難しいかもしれません。 新しいタイプのオブジェクトをサポートするには、AbstractFactoryクラスとそのすべてのサブクラスを変更する必要があります。

4. 概要

この記事では、AbstractFactoryのデザインパターンについて学びました。

最後に、いつものように、これらの例の実装はGitHubにあります。