Factory Method パターン
初めて見たとき、メリットが全然分からなかったFactory Methodパターン。
Factory Methodとは
- 生成に関するデザインパターン
- GoFによって定義されたデザインパターンのひとつ
- クラス図はWikipedia参照
Factory Method パターン
要点
- あるクラスが他のクラスを使用する場合、スーパークラスではスーパークラスを、サブクラスではサブクラスを用いる
- スーパークラス(Creator)では、対応するスーパークラス(Product)を使用
- サブクラス(ConcreteCreator)では、対応するサブクラス(ConcreteProduct)を使用
- 使用する側のクラスでは、使用されるクラスを生成するためのメソッドを持つ
- スーパークラス(Creator)では抽象メソッドとして定義
- サブクラス(ConcreteCreator)では具体的に利用するサブクラス(ConcreteProduct)を生成する処理を実装
メリット
フレームワークを作成する人にとって保守性が向上すること。
Wikipediaに書かれている例(文字列を順に出力する機能を持つ、ListPrinterクラス)に従うと、例えば
- プロジェクトAでは辞書順で出力してほしい
- プロジェクトBでは文字列長順で出力してほしい
- フレームワークを作成する人にとっては、プロジェクトの事情は考慮したくない
⇒Comparatorを生成するためのクラスを用意したから、後はそれぞれのプロジェクトで勝手に実装してね
ということになる。
このデザインパターンを見たときにメリットが理解できなかったのは、フレームワークの使用者の視点で見ていたからだと思う。
「Creatorのサブクラスは各プロジェクトで1つだけ定義して使うもの」と捉えると、フレームワーク作成者側のメリットが見えてくる。
メリットを理解する上では、以下のページが大変参考になった。
http://might1976.doorblog.jp/archives/54011290.html
所感
様々なプロジェクトで使用されるフレームワークの作成者の視点で見れば、良いデザインパターンだと思う。
逆に言えば、複数のプロジェクトを立ち上げることがないのであれば、使う必要もないと思う。
Web上にはFactoryパターンとFactory Methodパターンを混同しているサイトもあるようなので注意。