Factory Method
デザインパターンの「FactoryMethod」の意味(というかメリット)を今日理解した.でも言葉で説明するのは難しいな….
- 作者: エリックガンマ,ラルフジョンソン,リチャードヘルム,ジョンブリシディース,Erich Gamma,Ralph Johnson,Richard Helm,John Vlissides,本位田真一,吉田和樹
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 1999/10
- メディア: 単行本
- 購入: 21人 クリック: 711回
- この商品を含むブログ (202件) を見る
たとえば,
Product item = new HogeProduct(); // HogeProductはライブラリとして提供される
というコードがあるとする.これは,ライブラリとして提供されるHogeProduct(これはProductクラスのサブクラス)のインスタンスを生成し,HogeProductという「製品」を作る例である.
プログラムがこのように書かれていると,ライブラリ作者がHogeProductの名前をHigeProductに変更したときに,ライブラリを使う側の人も作ったプログラムを変更する必要がある.つまり
Product item = new HigeProduct(); // HogeProductの名前が変わった
に書き換えなければならない.これは大変.
そこで,Factory Methodの出番.
Factory Methodでは,CreatorクラスにProductクラスを「作る」メソッドを用意しておき,それぞれを継承したさまざまなConcrete Creatorクラスからそれに対応するConcrete Productクラスを「作る」.ここで「作る」というのは,Concrete Productクラスのコンストラクタを呼び出してインスタンスを生成することになる.
このとき,これらのクラスを使う側としては,何かのCreatorクラスのインスタンスをもっておけば,何がどうやってできるかを知らなくても何かのProductが手に入る.つまり,
Creator factory = new HogeCreator();// 何らかのConcrete Creator(ライブラリとして提供される) Product item = factory.create(); // 何が作られるかは知らない
で,これの何が嬉しいかというと,使う側はHogeCreatorクラスが「作る」Productのクラス名を知らなくてよい,つまり,HogeCreatorクラスを作る人がある時勝手に名前を変更したとしても,その影響が使う側には及ばないということ.これは,newによるコンストラクタ呼び出しを隠ぺいすることによって実現されている.
- 作者: 結城浩
- 出版社/メーカー: ソフトバンク クリエイティブ
- 発売日: 2007/01/27
- メディア: 大型本
- 購入: 12人 クリック: 189回
- この商品を含むブログ (110件) を見る
public class Hoge(){ // ProductでCreatorでConcrete Creator public static Hoge newHige(){ return new Hige(); } 〜略〜 private class Hige{ // Concrete Product 〜略〜 } }
実用的にはこんな感じで使うのかな〜.この場合,Higeクラスの名前はなんでも良い(つまり,いつ勝手に変更しても他に影響は及ばない)ということになる.