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. 圧縮アルゴリズム勉強メモ

comments powered by Disqus