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パターンを混同しているサイトもあるようなので注意。

関連記事


  1. Open Session in Viewは使用すべきなのか?
  2. Singleton パターン
  3. イミュータブルオブジェクト
  4. Strategy パターン
  5. Template Method パターン
  6. rmコマンドとmvコマンドの事故に備えた安全な使い方
  7. 圧縮アルゴリズム勉強メモ