Javaでの抽象ファクトリパターン

Javaの抽象ファクトリパターン

1. 概要

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

ブックDesign Patterns: Elements of Reusable Object-Oriented Softwareには、Abstract Factory“provides an interface for creating families of related or dependent objects without specifying their concrete classes”. が記載されています。つまり、このモデルを使用すると、一般的なパターンに従うオブジェクトを作成できます。

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

2. 抽象ファクトリー設計パターンの例

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

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

image

まず、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,など)のより具体的な実装を作成できます。

Abstract Factoryは、依存オブジェクトのファミリーを扱います。 そのことを念頭に置いて、いくつかの実装(White, Brown,…)を備えたインターフェイスとして、もう1つのファミリColorを紹介します。

ここでは実際のコードをスキップしますが、hereで見つけることができます。

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

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

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

public class AnimalFactory implements AbstractFactory {

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

        return null;
    }

}

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

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

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. 抽象ファクトリパターンを使用する場合:

  • クライアントは、システム内でオブジェクトを作成および構成する方法とは無関係です。

  • システムはオブジェクトの複数のファミリーで構成され、これらのファミリーは一緒に使用するように設計されています

  • 特定の依存関係を構築するにはランタイム値が必要です

While the pattern is great when creating predefined objects, adding the new ones might be challenging。 新しいタイプのオブジェクトをサポートするには、AbstractFactoryクラスとそのすべてのサブクラスを変更する必要があります。

4. 概要

この記事では、Abstract Factoryの設計パターンについて学びました。

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