ぴぐノート

Good code is its own best documentation.

デザインパターン

オブジェクトの生成に一工夫!FactoryMethodパターン

投稿日:

みなさんは「工場」と言われたときに何の工場を想像するでしょうか?
車に、缶詰、飲み物などいろいろな工場があります。

今回紹介するFactoryMethodパターンは、「オブジェクトを生成する方法」に一工夫を加えるデザインパターンです。
と、言ってもなかなかうまく伝わりませんね。

実際に行っている操作に比べて言葉にすると難しいように感じられますが、
FactoryMethodパターンを使うことで「パッケージに依存しないプログラミング」が可能となります。

FactoryMethodパターンの実装

言葉で概要を説明するよりも先に実装を確認してもらった方が分かりやすいかもしれません。
ここでのサンプルプログラムは「車」オブジェクトを作る工場を考えてみましょう。

Factoryクラス(抽象クラス)

FactoryクラスではTemplateパターンを使って作成しています。
createメソッドでは、製品を作り(createProduct)、その製品を登録し(registerProduct)し、出荷(return)します。
製造方法や、登録の方法などはFactoryクラスのサブクラスに委任しています。

Productクラス(抽象クラス)

Factoryクラスで作成される製品はどんな形であれ使用することができるはずです。
今回の車であれば使用 = 運転すると考えてもいいでしょうか。

CarFactoryクラス

Factoryクラス(工場のテンプレート)を継承し、車の製造”工場”を作りました。
createProductではCarオブジェクトを作成し、registerProductでは車を製造したオーナー( = メーカー)を登録します。
CarFactoryクラスはパッケージが異なることに注意してください。

Carクラス

Product(製品)クラスを継承した、車クラスです。
製造された際に、「”メーカー”の車を作成」とコンソールに表示し、実際に使用する(use)する場合に、「”メーカー”の車を走らせる」と表示するだけの簡単なコードです。

Mainクラス

FactoryMethodパターンを確認するためだけのサンプルプログラムです。

FactoryMethodパターンの確認

一度動かしてみていただければ、まぁそうなるだろうな。程度の感想かもしれません。
ここで重要なのはFactoryクラスはどんな工場なのか全くわからないことです。
(com.xoxopigs.carパッケージのインポートもされない。)

車であろうが、野菜であろうが、缶ジュースであろうが、Factoryクラスは関知していないのです。
これはFactoryMethodパターンを使ってオブジェクトの生成に一工夫し、抽象メソッドとしたことに由来します。

まとめ

うーん、これはあまりうまく伝えられていない気がします。
一度サンプルコードを実行すると、「あー、なるほど。そういうことか。」とイメージはつかめると思うので、
実際に打ち込んで動作を確認して、改造してみてください。

今回のサンプルコードではFactoryMethodを抽象メソッドとしましたが、その他にも

  • 実装されていない場合にエラーが出るように定義する。
  • デフォルトの実装を定義し、オーバーライドで対応する。

といった方法も考えられます。
またうまく伝えられるように色々試してみて何か補足があればまた記事にしますね!

スポンサーリンク

スポンサーリンク

-デザインパターン

執筆者:

関連記事

数え上げのデザインパターン Iteratorパターン

デザインパターンの中でももっとも理解がしやすく、また利用価値も高いものでIteratorパターンがあります。Iteratorパターンは数え上げのためのパターンです。顧客管理では顧客をあいうえお順に並べ …

インスタンスが1つしか作られないように制限するSingleton(シングルトン)パターン

もっとも頻繁に使われるデザインパターンといえば、Singletonパターンでしょう。 このSingletonパターンには、「インスタンスが1つしか作られないことを保証する」という意味が含まれます。 も …

アルゴリズムを定義してロジックはサブクラスに任せるTemplateパターン

今回紹介するTemplateパターンは比較的理解しやすいデザインパターンです。 タイトルにもあるように、「アルゴリズムだけを定義し、詳しい実装についてはサブクラスに任せる」ような仕組み、これがTemp …

再利用のためのデザインパターン Adapterパターン

実際の業務で新しいコードを1から書き始めるなんてことは滅多にありません。 基本は既にあるコードを追加・修正しバージョンアップを重ねるという業務がほとんどですね。 また1から作る場合でも別のプロジェクト …