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。