SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング

ラムダ式でTemplate Methodパターン+Factory Methodパターンで実装されたコードをシンプルにする ~ 継承から委譲、そして単なる手続きへ

デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング 最終回

Abstract Factoryパターンのおさらい

 Abstract Factoryパターンも、Factory Methodパターンと同様に、オブジェクトの生成を柔軟に実現するためのパターンです。ただし、Factory Methodパターンがクラスの継承を用いて、サブクラスにオブジェクト生成を任せるのに対して、Abstract Factoryパターンではオブジェクトを生成する専用のクラスを用います。

 典型的なAbstract Factoryパターンのプログラムには、図5に示すようなクラス、インタフェースが登場します。

図5:Abstract Factoryパターンのクラス図
図5:Abstract Factoryパターンのクラス図

 

  • AbstractFactory: オブジェクト生成処理を抽象メソッドとして宣言するファクトリのインタフェース
  • ConcreteFactory: オブジェクト生成処理を実装するファクトリのクラス
  • AbstractProduct: 生成されるオブジェクトのインタフェース
  • ConcreteProduct: 実際に生成されるオブジェクトのクラス
  • Client: ファクトリを使ってオブジェクトを生成し、利用するクラス

 たとえば、リスト1のウグイスのシミュレータは、Abstract Factoryメソッドを使うとリスト2のように書けます。

リスト2: Warbler2.java
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のような構成になるはずです。

図6: ジョブコントローラプログラム(Abstract Factoryパターン)
図6: ジョブコントローラプログラム(Abstract Factoryパターン)

 

  • Supplierインタフェース:ジョブを生成するファクトリのインタフェース。AbstractFactoryに相当する
  • BackupJobFactoryクラス:バックアップジョブを生成するファクトリのクラス。ConcreteFactoryに相当する
  • JobDefinitionクラス:ファクトリを用いてジョブを生成し、利用するClient
  • Jobクラス: AbstractProduct
  • BackupJobクラス: ConcreteProduct

 JobDefinition クラスが抽象クラスでなくなっていることに注意してください。サブクラスにジョブの生成を任せる代わりに、コンストラクタで指定された引数を使ってジョブを生成しています。

次のページ
ジョブコントローラ(Abstract Factoryパターン)

この記事は参考になりましたか?

デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング連載記事一覧

もっと読む

この記事の著者

宮川 拓(ミヤカワ タク)

日本Javaユーザーグループ幹事。東京のシステムインテグレータに勤務。Java VM上で動作する言語である「Kink」を開発中。相撲とアメリカ文学とスコティッシュポップを愛する。 ・ブログ: http://d.hatena.ne.jp/miyakawa_taku/ ・Twitter: @miyakawa_taku

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8571 2015/03/27 14:00

おすすめ

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー