天天看點

8 設計模式_工廠模式(Factory Method)

Factory Method工廠方法

“ 對象建立” 模式
  • 通過“對象建立” 模式繞開new,來避免對象建立(new)過程中所導緻的緊耦合(依賴具體類),進而支援對象建立的穩定。它是接口抽象之後的第一步工作。
  • 典型模式
    • Factory Method
    • Abstract Factory
    • Prototype
    • Builder
動機(Motivation)
  • 在軟體系統中,經常面臨着建立對象的工作;由于需求的變化,需要建立的對象的具體類型經常變化
  • 如何應對這種變化?如何繞過正常的對象建立方法(new),提供一種“封裝機制”來避免客戶程式和這種“具體對象建立工作”的緊耦合?
模式定義
  • 定義一個用于建立對象的接口,讓子類決定執行個體化哪一個類。Factory Method使得一個類的執行個體化延遲(目的:解耦,手段:虛函數)到子類
舉個例子
  • 使用模式前
class ISplitter{
public:
    virtual void split()=0;
    virtual ~ISplitter(){}
};
//派生出不同的子類
class BinarySplitter : public ISplitter{  
};

class TxtSplitter: public ISplitter{  
};

class PictureSplitter: public ISplitter{ 
};

class VideoSplitter: public ISplitter{  
};
           
class MainForm : public Form
{
	TextBox* txtFilePath;
	TextBox* txtFileNumber;
	ProgressBar* progressBar;

public:
	void Button1_Click(){
		//依賴具體類,依賴倒置原則,不應該依賴實作細節,應該依賴抽象.降低耦合性。
		//違反開閉原則,新的子類時又需要修改,而不是擴充
		ISplitter * splitter = new BinarySplitter();
        splitter->split();
	}
};
           

*使用工廠方法後

//抽象類
class ISplitter{
public:
    virtual void split()=0;
    virtual ~ISplitter(){}
};

//工廠基類
class SplitterFactory{
public:
    virtual ISplitter* CreateSplitter()=0;
    virtual ~SplitterFactory(){}
};
           
//具體類
class BinarySplitter : public ISplitter{  
};
class TxtSplitter: public ISplitter{
};
class PictureSplitter: public ISplitter{   
};
class VideoSplitter: public ISplitter{
};

//具體工廠
class BinarySplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new BinarySplitter(); //變化的地方
    }
};

class TxtSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new TxtSplitter(); //變化的地方
    }
};

class PictureSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new PictureSplitter(); //變化的地方
    }
};

class VideoSplitterFactory: public SplitterFactory{
public:
    virtual ISplitter* CreateSplitter(){
        return new VideoSplitter(); //變化的地方
    }
};
           
class MainForm : public Form
{
    SplitterFactory*  factory;//工廠
public:
    MainForm(SplitterFactory*  factory){
        this->factory=factory; //對工廠方法初始化
    }
    
	void Button1_Click(){    
		ISplitter * splitter=
            factory->CreateSplitter(); //多态new   
        splitter->split();
	}
};
           
結構(structure)
  • 紅色框(抽象類,固定不變的部分)
    • creator抽象工廠基類。FactoryMethod(例子中的CreateSplitter)傳回一個Product指針(例子中的ISplitter)
  • 藍色框(子類,變化的部分)
    • 不同的工廠方法FactoryMethod(例子中的CreateSplitter)産生不同的 Product(ISplitter的子類)
8 設計模式_工廠模式(Factory Method)
要點總結
  • Factory Method模式用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經常變化的具體類型,緊耦合關系(new)會導緻軟體的脆弱。
  • Factory Method模式通過面向對象的手法,将所要建立的具體對象工作延遲到子類,進而實作一種擴充(而非更改)的政策(開閉原則),較好地解決了這種緊耦合關系。
  • Factory Method模式解決“單個對象”的需求變化。缺點在于要求建立方法/參數相同。

繼續閱讀