設計模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點,然后分離它們,從而管理變化。將變化像小兔子一樣關到籠子里,讓它在籠子里隨便跳,而不至于跳出來把你整個房間給污染掉。
設計思想
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。Factory Method 使得一個類的實例化延遲到子類。(目的:解耦,手段:虛函數)
動機
在軟件系統(tǒng)中,經常面臨著創(chuàng)建對象的工作;由于需求的變化,需要創(chuàng)建的對象的具體類型經常變化。
如何應對這種變化?如何繞過常規(guī)的對象創(chuàng)建方法(new),提供一種“封裝機制”來避免客戶程序和這種“具體對象創(chuàng)建工作”的緊耦合?
Factory Method模式用于隔離類對象的使用者和具體類型之間的耦合關系。面對一個經常變化的具體類型,緊耦合關系會導致軟件的脆弱。
Factory Method模式通過面向對象的收發(fā),將所要創(chuàng)建的具體對象工作延遲到子類,從而實現(xiàn)一種擴展(而非更改)的策略,較好地解決了這種耦合關系。
Factory Method 模式解決“單個對象”的需求變化。缺點在于創(chuàng)建方法、參數需要相同。
業(yè)務場景
在 MainForm 中需要對文件進行分解操作,但是分解的文件可能是二進制文件,文本文件,圖片文件等等,這時候我們需要在 MainForm 創(chuàng)建對應的對象,然后調用分解函數。
一個非常直觀的思路是:
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {
}
};
class BinarySplitter : public ISplitter {
//實現(xiàn)分解二進制文件
};
class TxtSplitter : public ISplitter {
//實現(xiàn)分解TXT文件
};
class PictureSplitter : public ISplitter {
//實現(xiàn)分解圖片文件
};
class VideoSplitter : public ISplitter {
//實現(xiàn)分解視頻文件
};
class MainForm : public Form {
public:
void Button1_Click() {
ISplitter* splitter = new BinarySplitter();
splitter->split();
}
};
這是很自然的一種寫法,問題的關鍵在于這一句代碼:
ISplitter* splitter = new BinarySplitter();
在等號的左邊,是一個抽象類,屬于抽象依賴(編譯時依賴),但是等號的右邊,是一個具體類,屬于細節(jié)依賴。根據依賴倒置原則,抽象不應該依賴于細節(jié),而這種寫法很明顯違背了這種原則。
下面看看使用工廠模式應該怎么去實現(xiàn):文章來源:http://www.zghlxwxcb.cn/news/detail-687580.html
代碼案例
編寫專門的工廠類,再編寫具體的工廠子類。在具體操作的 MainForm 中通過構造把子類對象傳入。用多態(tài)的方式,避免了 MainForm 中的固定。文章來源地址http://www.zghlxwxcb.cn/news/detail-687580.html
// 抽象類
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {
}
};
// 工廠基類
class SplitterFactory {
public:
// 虛函數,延遲到運行時依賴
virtual ISplitter* CreateSplitter() = 0;
virtual ~SplitterFactory() {
}
};//創(chuàng)建一個工廠類,專門負責對象的實例化
// 具體類
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();
}
};
// 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();
}
};
到了這里,關于【設計模式】Head First 設計模式——工廠方法模式 C++實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!