ラムダ式でTemplate Methodパターン+Factory Methodパターンで実装されたコードをシンプルにする ~ 継承から委譲、そして単なる手続きへ
デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング 最終回
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 クラスが抽象クラスでなくなっていることに注意してください。サブクラスにジョブの生成を任せる代わりに、コンストラクタで指定された引数を使ってジョブを生成しています。
この記事は参考になりましたか?
- デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング連載記事一覧
-
- ラムダ式でTemplate Methodパターン+Factory Methodパターンで実...
- ラムダ式でObserverパターンで実装されたコードをシンプルにする ~ オブザーバオブジ...
- ラムダ式でStrategyパターンで実装されたコードをシンプルにする ~ そこから見えてく...
- この記事の著者
-
宮川 拓(ミヤカワ タク)
日本Javaユーザーグループ幹事。東京のシステムインテグレータに勤務。Java VM上で動作する言語である「Kink」を開発中。相撲とアメリカ文学とスコティッシュポップを愛する。 ・ブログ: http://d.hatena.ne.jp/miyakawa_taku/ ・Twitter: @miyakawa_taku
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア


