Factory Method模式
“對象創(chuàng)建”模式
通過“對象創(chuàng)建”模式繞開new,來避免對象創(chuàng)建(new)過程中所導(dǎo)致的緊耦合(依賴具體類),從而支持對象創(chuàng)建的穩(wěn)定。它是接口抽象之后的第一步工作。
動機
在軟件系統(tǒng)中,經(jīng)常面臨著創(chuàng)建對象的工作;由于需求的變化,需要創(chuàng)建的對象的具體類型經(jīng)常變化。
如何應(yīng)對這種變化?如何繞過常規(guī)的對象創(chuàng)建方法(new),提供一種“封裝機制”來避免客戶程序和這種“具體對象創(chuàng)建工作”的緊耦合?
模式定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method使得一個類的實例化延遲(目的:解耦,手段:虛函數(shù))到子類。--《設(shè)計模式》GoF
使用實例
//ISplitterFactory.cpp
//抽象類
class ISplitter{
public:
virtual void split()=0;
virtual ~ISplitter(){}
};
//工廠基類
class SplitterFactory{
public:
virtual ISplitter* CreateSplitter()=0;
virtual ~SplitterFactory(){}
};
//MainForm
class MainForm : public Form
{
SplitterFactory* factory;//工廠
public:
MainForm(SplitterFactory* factory){
this->factory=factory;
}
void Button1_Click(){
ISplitter * splitter=
factory->CreateSplitter(); //多態(tài)new
splitter->split();
}
};
//FileSplitter
//具體類
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();
}
};
要點總結(jié)
Factory Method模式用于隔離類對象的使用者和具體類型之間的耦合關(guān)系。面對一個經(jīng)常變化的具體類型,緊耦合關(guān)系(new)會導(dǎo)致軟件的脆弱。
Factory Method模式通過面向?qū)ο蟮氖址?,將所要?chuàng)建的具體對象工作延遲到子類,從而實現(xiàn)了一種擴展(而非更改)的策略,較好的解決了這種緊耦合關(guān)系。
Factory Method模式解決“單個對象”的需求變化。缺點在于要求創(chuàng)建方法/參數(shù)相同。