例えば、工場では商品を作り、ある処理を行うというフローがある時には
public abstract class Factory {
/**
* 商品を作る.
* @param name 商品名
*/
public final Product create(String name) {
Product p = createProduct(name);
doSomething(p);
return p;
}
protected abstract Product createProduct(String name);
protected abstract void doSomething(Product p);
}
のようにしておきます。具体的な処理はこのクラスを継承して、
public class SampleFactory extends Factory {
protected Product createProduct(name){
return new SampleProduct(name);
}
protected void doSomething(Product p) {
・・・
}
}
とします。Mainとなるクラス(Factoryを呼ぶクラス)は以下のような処理があれば良いです。
Factory factory = new SampleFactory();
Product product = factory.create("sample");
SampleProductクラスはProductクラスを継承したクラス(具体的な商品を表すクラス)です。
こうすることで、どんな商品が登場しても(Factory、Productクラスを継承したクラスがどんなに増えても)「商品を作って、ある処理を行う」というフローが変わりません。また、フレームワーク側は上記のようなSampleFactoryクラスやSampleProductクラスに依存しません。言い換えると、新商品が登場してもフレームワークを修正する必要がないということです。
関連パターン
「Template Methodパターン」Factory MethodパターンはTemplate Methodパターンの応用例
「Singletonパターン」FactoryクラスはSingletonの場合が多い。
「Compositeパターン」製品がcomposite(製品の中にある製品が含まれる)になる場合がある。
「Iteratorパターン」Iteratorインスタンス作成にはFactory Methodパターンが使われることがある。

0 件のコメント:
コメントを投稿