設計模式——工廠方法(Factory Method)

Factory Method,Abstract Factory,Prototype,Builder屬於對象創建模式。

motivation:在創建對象時,創建對象的具體類型經常變化;定義一個用於創建對象的接口,讓子類來決定實例化哪個類,使得實例化延遲(目的是解耦,手段是虛函數)。

key interface or class:

        1. product的基類接口;

        2. factory的基類接口。

feature: product和factory的基類接口,facotry具體類返回new的具體product。

structure:

template codes:

//重構前
//在MainForm函數中常見出需要的splitter
class MainForm{
public:
    void button_1(){
    
    TxtSplitter* splitter = new TxtSplitter(); //此處存在緊耦合,且不支持未來變化
    splitter->split();
    }
}

//引入接口
class MainForm{
public:
    void button_1(){

    ISplitter* splitter = new TxtSplitter(); //此處存在緊耦合,但是支持未來變化
    splitter->split();
    }
}
//ISplitter接口
class ISplitter{
public:
    virtual split()=0;
    virtual ~ISplitter(){}
}
//實現具體的各種Splitter的類
class TxtSplitter: public ISplitter{
public:
    virtual split(){
    //TxtSplitter的split方法
    }

};

//引入工廠模式後
class MainForm{
SplitterFactory* factory;
public:
    void button_1(){
    //解耦和,MainForm不知道具體的factory類;只需要調用者在使用時指定;
    ISplitter* splitter = factory->createSplitter(); 
    splitter->split();
    }
}
//工廠基類
class SplitterFactory{
public:
    virtual ISplitter* createFactory()=0;
    virtual ~createFactory(){}
}
//具體的工廠類
class TxtSplitterFactory{
public:
    virtual ISplitter* TxtSplitterFactory(){
        return new TxtSplitter();
    }
}


summary:

1. factory method用於隔離類型的使用者和具體類型之間的耦合關係(具體類型經常變化時,緊耦合會使軟件十分脆弱);

2.factory method將對象的創建延遲到了子類;

3.factory method解決單個對象的需求變化,缺點是需要的參數必須相同;

2.內存管理時,對象可以在factory中提供release的函數,也可以在使用後delete。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章