1.概要

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

本はhttps://books.google.co.jp/books?id=K4qv1D-LKhoC

JDKのAbstract Factoryデザインパターンの例は、

javax.xml.parsers.DocumentBuilderFactory

クラスの

newInstance()

です。


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

この例では、Factory Method Designパターンの2つの実装、

AnimalFactory



ColorFactory.

を作成します。

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


https://www.baeldung.com/uploads/updated


abstract

factory



border__fix-100×66.png%20100w[]

まず、

Animal

クラスのファミリーを作成し、後でそれを抽象ファクトリーで使用します。

これが

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";
    }
}

さらに、

Dog、Bear、

など、

Animal

インターフェースのより具体的な実装を正確にこの方法で作成できます。

Abstract Factoryは従属オブジェクトのファミリーを扱います。それを念頭に置いて、いくつかの実装(

White、Brown、…​

)を持つインターフェースとしてもう1つのファミリー

Color

を紹介します。

現時点では実際のコードをスキップしますが、https://github.com/eugenp/tutorials/tree/master/core-java[ここ]にあります。

これで複数のファミリの準備が整いましたので、それらのために

AbstractFactory

インタフェースを作成できます。

public interface AbstractFactory {
    Animal getAnimal(String animalType) ;
    Color getColor(String colorType);
}

次に、前のセクションで説明したFactory Methodデザインパターンを使用して

AnimalFactory

を実装します。

public class AnimalFactory implements AbstractFactory {

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

        return null;
    }

    @Override
    public Color getColor(String color) {
        throw new UnsupportedOperationException();
    }

}

同様に、同じデザインパターンを使用して

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 Abstract Factory Patternを使用する場合

  • クライアントは、どのようにしてオブジェクトを作成して構成するかには依存しません。

システム
** システムは、オブジェクトの複数のファミリーから構成されています。

家族は一緒に使用するように設計されています
** 特定の依存関係を構築するには実行時の値が必要です

  • 事前定義されたオブジェクトを作成するときパターンは素晴らしいですが、新しいものを追加するのは難しいかもしれません** 。新しいタイプのオブジェクトをサポートするには、

    AbstractFactory

    クラスとそのすべてのサブクラスを変更する必要があります。

4.まとめ

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

最後に、いつものように、これらの例の実装はhttps://github.com/eugenp/tutorials/tree/master/patterns/design-patterns[GitHubに載っています]。