2010年5月2日日曜日

Factory Methodパターン

Factory Methodパターンとは、インスタンス生成を前回のTemplate Methodパターンで構成したパターンになります。インスタンス生成を行う(まさしく工場と言える)Factoryクラスと生成したものを表すProductクラスをフレームワークとして用意し、具体的な処理はそれぞれを継承して定義します。

例えば、工場では商品を作り、ある処理を行うというフローがある時には
  1. public abstract class Factory {  
  2.     /** 
  3.      * 商品を作る. 
  4.      * @param name 商品名 
  5.      */  
  6.     public final Product create(String name) {  
  7.         Product p = createProduct(name);  
  8.         doSomething(p);  
  9.         return p;  
  10.     }  
  11.       
  12.     protected abstract Product createProduct(String name);  
  13.     protected abstract void doSomething(Product p);  
  14. }  

のようにしておきます。具体的な処理はこのクラスを継承して、
  1. public class SampleFactory extends Factory {  
  2.     protected Product createProduct(name){  
  3.         return new SampleProduct(name);  
  4.     }  
  5.     protected void doSomething(Product p) {  
  6.         ・・・  
  7.     }  
  8. }  

とします。Mainとなるクラス(Factoryを呼ぶクラス)は以下のような処理があれば良いです。
  1. Factory factory = new SampleFactory();  
  2. 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 件のコメント:

コメントを投稿