什麼都明白的人最溫柔也最冷漠。
----- 網易雲熱評
定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類。factory method使得乙個類的例項化延遲(目的:解耦,手段:虛函式)到子類。
需求還記得在講觀察者模式的時候,我們的需求是實現將大檔案分割成若干的小檔案。我們先看一下實現**:
class
mainform
:public form,
public iprogress
};
我們可以觀察到,我們建立物件的方式是直接new的這個物件。那麼我們知道根據面向介面程式設計原則,當我們需要對乙個類進行分類擴充套件時,物件的型別,我們應該將其宣告為抽象類或者介面。接下來我們就這麼做:
class
isplitter
}class
binarysplitter
:public isplitter
;class
txtsplitter
:public isplitter
;class
picturesplitter
:public isplitter
;class
videosplitter
:public isplitter
;
每個isplitter的子類都有其具體的實現。那麼我們應該這麼建立物件:
isplitter* splitter1 =
newbinarysplitter
(filepath, number)
;isplitter* splitter2 =
newtxtsplitter
(filepath, number)
;isplitter* splitter3 =
newpicturesplitter
(filepath, number)
;isplitter* splitter4 =
newvideosplitter
(filepath, number)
;
那麼根據依賴倒置原則:我們應該依賴抽象,不該依賴實現細節。可以看到上面的建立例項**,左邊我們定義的是抽象型別,但是右邊我們還是要依賴實現細節。我們知道上面**建立物件我們都使用的new
關鍵字,那麼我麼如何繞開new
,來避免物件建立(new)過程中所導致的緊耦合(依賴具體類),從而支援物件建立的穩定呢?
我們來定義乙個工廠:
class
splitte***ctory};
// 建立物件..
. splitte***ctory factory;
splite***ctory* sp = factory.
createsplitter(.
..);
...
我們試圖以方法的形式建立物件,但是可以發現,還是無法脫離new
的 「魔爪」 。我們還是依賴著具體實現… 那怎麼辦呢?仔細想想,我們上面直接建立物件都是編譯時依賴,能不能將它轉換成執行時依賴呢?
class
isplitter};
class
splitte***ctory};
// 建立物件..
.// 我們建立指標
splitte***ctory* factory;
// 真正建立物件時交給未來 (factory)
isplitter* splitter = factory-
>
createsplitter()
;...
針對要建立的具體物件,我們分別定義其生產該型別物件的工廠:
class
binarysplitte***ctory
:public splitte***ctory};
// 其他類和上述相似..
.
我們可以看到,每乙個具體的類,都有其對應的工廠。那麼你看到這裡也許很懵,這樣解決了我們原先遇到的問題了嗎?請繼續看下面的**改進:
class
mainform
:public form
void
button_click()
};
至此,我們可以看到mainform中已經極大程度的降低了依賴,我們可以觀察裡面的所有物件都是抽象的。依賴是不是已經降低了呢? 工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
工廠方法模式(一) 簡單工廠方法模式
ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...