Javaでの抽象ファクトリパターン
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に載っています]。