Factory Method

デザインパターンの「FactoryMethod」の意味(というかメリット)を今日理解した.でも言葉で説明するのは難しいな….

たとえば,

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によるコンストラクタ呼び出しを隠ぺいすることによって実現されている.

Java言語で学ぶリファクタリング入門

Java言語で学ぶリファクタリング入門

では,Factory Meghodの使う例として,Creator,Concrete Creator,Productクラスがひとつになっているのがある.

public class Hoge(){                // ProductでCreatorでConcrete Creator
public static Hoge newHige(){
return new Hige();
}
~略~
private class Hige{                 // Concrete Product
~略~
}
}

実用的にはこんな感じで使うのかな~.この場合,Higeクラスの名前はなんでも良い(つまり,いつ勝手に変更しても他に影響は及ばない)ということになる.

コメントする