デザインパターン プログラミング Java

AbstractFactoryパターンをenumで生成するメリット

投稿日:2020年7月12日 更新日:

AbstractFactoryパターンの説明には、実行時引数に文字列を渡したり、フラグでif-else判定する例をよく見かける。

しかし、どんなFactoryが生成可能を知らない担当者がFactoryを利用する場合はどうするのだろうか?
自分でコードを調べるか、Factory側のコード担当者に確認するかのどちらかになる。

Factory側の担当者は、クライアントのコード担当者の為であろうと、
自分にいちいち聞きに来た時に答えるのが面倒だという理由であろうと、
『Enumにしておけば何を生成できるかを明白に示せる』ということを知っておいてもらいたい。

よく見るFactroy生成方法

クラス名を文字列で渡して判定するコード例


・指定する文字列が異なることは無いと言えるか?
・大文字小文字を間違わないということはあり得るか?
・そもそも、存在しないFactoryを呼び出すようなことにはならないか?
文字列を指定するコードでは、上記の問題が起こりうる。

フラグで生成するFactoryを判定する例


これも文字列の場合と同じ問題を抱えている。
この場合、予期しないFactoryが生成される可能性がある。
つまり、0以外はすべてFactroyYが生成されるが、それが想定通りの仕様であることを保証しないということだ。

Enumを使う例

Enumを使って実装すると、生成するFactroyを明示的に示し、かつ存在しないFactoryを生成することは無くなる。
※以降のコードは、TECH SCOREのAbstractFactoryパターンを私が独自に改良したものです。
 TECH SCOREとは一切関係ないことはお含みおきください。

8. AbstractFactory パターン

Use.java(クライアント)

EnumであるHotpotTypeでRecipe(Factoryクラス)を指定して生成しています。

HotpotType.java(Factoryを生成するEnum)

生成可能なFactoryをここで定義しておきます。
Sukiyaki(すき焼き)を指定すれば、SukiyakiRecipeを生成するという具合です。

Recipe.java(Factoryクラス)

Factoryの生成はHotpotTypeに委譲しているため、抽象的な実装のみに専念できます。

メリット

・Enumに存在するFactroyしか生成できないため、誤ったFactoryを生成することが無い。
・チーム開発の場合、生成可能なFactoryクラスがなんであるかをクライアント側のコード担当者が知っている必要がない。
 Factoryクラスが不足しているなら、Factory側を担当しているプログラマに依頼すればよいだけとなる。
・Factoryの追加が簡単。
 Enumに必要なFactoryクラスを追加するだけなので、if文を修正するようなことは不要である。

自分一人だけでプログラムを書いていれば、このようなことは考えなくてもよいと思うが、
チームで仕事をし、かつモジュールを分割して担当しているのであれば、
このようなに考えることで変更容易性を高め、モジュール化を円滑にできる。

クラス図

Github

https://github.com/TakumiKondo/designpattern/tree/master/src/abstractfactory/hotpot

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-デザインパターン, プログラミング, Java
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

【Java】オブジェクト指向の練習題材(会員オブジェクト)

前回記事、オブジェクト指向とは何なのかを簡単に説明してみるの練習題材です。   仕様 以下の会員クラスを作成し、Mainクラスで表示する。 会員クラスには、「会員」という単位で持つことできる …

Observerパターンってどう使うの?を考える(商品の予約)

目的 Observerパターンの使いどころとなる状況を具体例でもって理解する。   ゴール(実現すること) 商品の予約システムにおけるユーザ通知   実装する機能 ・商品を予約する …

フロントエンジニアとバックエンドエンジニアのどちらになるべきか?

対象読者 ・これからWebエンジニアを目指す人 ・フロントエンジニアとバックエンドエンジニアの違いを知らない人   フロントエンジニアかバックエンドエンジニアか? ・役割から考える フロント …

【SpringBoot入門】#4~ headerの作成と埋め込み

概要 全ての画面で使用するヘッダーを作成します。 そして、Index画面に埋め込むところまでを行います。 共通ヘッダーの作成

・&lt …

【JdbcTemplate】Queryの書き方(更新系)

  前提 以下のテーブル(users)を持ち、格納するのはUserクラスという想定で説明していきます。 usersテーブル

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。