2010年3月8日 星期一

Design Pattern : 04 Factory

要建立一個可以用來產生product 的factory class
想要做到,不管什麼product都可以套用相同的產生流程
也就是說一個factory可以用來產生不同的product
這時候就可以用Factory Pattern

定義好抽象的Factory類別與Product類別當框架Framework
在Factory定義實體method產生Product物件
在外部程式要利用Factory產生Product

都是利用上層Framework設定好抽象的factory與product
所提供的public method

但真正內部運作的是分別繼承自factory與product的realFactory
與realProduct

如果要產生不同的product,就可以分別產生不同的realFactory與
realProduct
在不變動外部Main程式狀況下 即可直接使用
參與者
1.Factory (屬framwork)
在Factory class內是用到了Templete Pattern,
提供外部呼叫使用的public method(create),是一個實體的method
而在這public method內呼叫執行的是一些抽象method
這些method就必須要被繼承的子類別實作出來


public abstract classFactory{
    public Product create(){
        Product p =createProduct();
        registProduct(p);
        return p;
    }
    protected abstract Product createProduct();
    protected abstract void registProduct(Product p);
}

2.RealFactory (instance)
繼承自Factory後,把factory內定一的抽象method都實作出來

public class RealFactory extends Factory{
    protected Product createProduct(){
        return RealProduct();  
    };
    protected abstract void registProduct(Product p){
        .....
    };
}

3.Product (屬framework)
只定義public 抽象method,來規範外界要操作使用product的方法

public abstract class Product{
    public abstract void use();
}

4.RealProcuct(instance)
真正的產品class,繼承自Product,並把Product內定義的
抽象method 實作

public class RealProduct{
    public void use(){
        .....
    }
}

5.Main(外部主程式)
產生一個實體的Factory,雖然是new RealFactory()
但類別宣告,還是宣告在其上層的Factory
利用產生的factory來產生product
真正產生的是realProduct物件
但類別還是宣告在其上層的Product class


Factory factory=new RealFactory();
Product product=factory.creat()
product.use();



ps:在Product的子類別,不提供public的建構子,目的是在於
強制規範product只能經由factory去產生,而不能自行使用
new product()產生出來

沒有留言: