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的子類)
要點總結
- Factory Method模式用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經常變化的具體類型,緊耦合關系(new)會導緻軟體的脆弱。
- Factory Method模式通過面向對象的手法,将所要建立的具體對象工作延遲到子類,進而實作一種擴充(而非更改)的政策(開閉原則),較好地解決了這種緊耦合關系。
- Factory Method模式解決“單個對象”的需求變化。缺點在于要求建立方法/參數相同。