Abstract Factoryパターンのおさらい
Abstract Factoryパターンも、Factory Methodパターンと同様に、オブジェクトの生成を柔軟に実現するためのパターンです。ただし、Factory Methodパターンがクラスの継承を用いて、サブクラスにオブジェクト生成を任せるのに対して、Abstract Factoryパターンではオブジェクトを生成する専用のクラスを用います。
典型的なAbstract Factoryパターンのプログラムには、図5に示すようなクラス、インタフェースが登場します。
- AbstractFactory: オブジェクト生成処理を抽象メソッドとして宣言するファクトリのインタフェース
- ConcreteFactory: オブジェクト生成処理を実装するファクトリのクラス
- AbstractProduct: 生成されるオブジェクトのインタフェース
- ConcreteProduct: 実際に生成されるオブジェクトのクラス
- Client: ファクトリを使ってオブジェクトを生成し、利用するクラス
たとえば、リスト1のウグイスのシミュレータは、Abstract Factoryメソッドを使うとリスト2のように書けます。
import twitter4j.*;
/** ウグイス. */
public class Warbler2 {
/** Twitterクライアントのファクトリ. */
private final TwitterFactory twitterFactory;
public Warbler2(TwitterFactory twitterFactory) {
this.twitterFactory = twitterFactory;
}
/** さえずる. */
public void warble() {
Twitter twitter = this.twitterFactory.getInstance();
try {
twitter.updateStatus("ケキョケキョケキョ");
} catch (TwitterException exception) {
throw new WarblerException("さへずらざりけり", exception);
}
}
}
リスト2では、TwitterFactory クラスがAbstractFactoryに、Warbler2 クラスがClientに相当します。Warbler2 クラスはファクトリをコンストラクタの引数として取っています。したがって、Warbler2 クラスを使うプログラムは、TwitterFactory クラスのサブクラスなら何でもConcreteFactoryとして使うことができます。
ファクトリが提供するオブジェクト生成処理が1つだけである場合、Java SE 8の標準で提供される Supplier インタフェースを、AbstractFactoryとして使うこともできます。Supplier インタフェースは、引数を取らずにオブジェクトを戻す get メソッドを唯一の抽象メソッドとして宣言する関数型インタフェースです。
以上より、Abstract Factoryパターンを採用したジョブコントローラプログラムは、図6のような構成になるはずです。
- Supplierインタフェース:ジョブを生成するファクトリのインタフェース。AbstractFactoryに相当する
- BackupJobFactoryクラス:バックアップジョブを生成するファクトリのクラス。ConcreteFactoryに相当する
- JobDefinitionクラス:ファクトリを用いてジョブを生成し、利用するClient
- Jobクラス: AbstractProduct
- BackupJobクラス: ConcreteProduct
JobDefinition クラスが抽象クラスでなくなっていることに注意してください。サブクラスにジョブの生成を任せる代わりに、コンストラクタで指定された引数を使ってジョブを生成しています。


