例えば、工場では商品を作り、ある処理を行うというフローがある時には
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 件のコメント:
コメントを投稿