「物件建立」模式
通過「物件建立」模式繞開new,來避免物件建立(new)過程中所導致的緊耦合(依賴具體類),從而支援物件建立的穩定。它是介面抽象之後的第一部工作。
典型模式有
在軟體系統中,經常面臨著建立物件的工作;由於需求的變化,需要建立的物件的具體型別經常變化。
那麼就出現了一些問題:如何應對這種變化?如何繞過常規的物件建立的物件方法(new),提供一種「封裝機制」來避免客戶程式和這種「具體物件建立工作」的緊耦合?
class
filespilter};
intmain()
假設上面這段**是為了實現乙個檔案分割的功能
這是乙個非常簡單的物件使用模式,那麼它有什麼問題呢?
目前看來好像是沒有什麼問題,我們需要在乙個變化的場景中看問題,看到它未來變化的需求。根據面向介面的設計原則,那麼我們就要去做乙個抽象類(介面)。面向介面的程式設計告訴我們,乙個物件的型別往往應該宣告成介面或抽象類,而不應該宣告成具體的類。
class
isplitter};
class
binaryspiltter
:public isplitter
;class
txtsplitter
:public isplitter
;class
picturesplitter
:public isplitter
;class
videosplitter
:public isplitter
;class
main
}
面向介面程式設計最簡單的表現形式就是變數要宣告成抽象基類。
那麼我們為什麼要實現面向介面程式設計呢?根據設計模式的依賴倒置原則:應該依賴抽象,不應該依賴實現細節。
isplitter *splitter =
newtxtsplitter
(filepath, number)
;
上面這行**等號的左邊是抽象依賴,而右邊是細節依賴,那麼在編譯時總體還是要依賴txtsplitter();屬於編譯時的細節依賴,違背了依賴倒置原則。
那麼該怎麼實現呢?總不可能去new乙個介面吧。
我們回顧一下物件建立模式的目標:繞開new,來避免物件建立(new)過程中所導致的緊耦合。
不能用new,那麼我們該怎麼做呢?
看看下面這個實現
class
splitte***ctory};
class
isplitter};
class
binaryspiltter
:public isplitter
;class
txtsplitter
:public isplitter
;class
picturesplitter
:public isplitter
;class
videosplitter
:public isplitter
;class
main
}
這麼做貌似是改善了一些,但是問題依然沒有解決,main()最終還是要依賴txtsplitter,只不過是繞了一層。還是沒有解決。
我們來回顧以下,c++在執行時依賴是怎麼實現的?自然是虛函式了。
class
isplitter};
class
splitte***ctory};
class
binaryspiltter
:public isplitter
;class
txtsplitter
:public isplitter
;class
picturesplitter
:public isplitter
;class
videosplitter
:public isplitter
;class
main
}
利用c++的多型,我們把真正建立物件交給未來,也就是splitte***ctory,進行執行時建立
//抽象類
class
isplitter};
//工廠基類
class
splitte***ctory};
class
binaryspiltter
:public isplitter
;class
txtsplitter
:public isplitter
;class
picturesplitter
:public isplitter
;class
videosplitter
:public isplitter
;class
binaryspiltte***ctory
:public splitte***ctory};
class
txtspiltte***ctory
:public splitte***ctory};
class
picturespiltte***ctory
:public splitte***ctory};
class
videospiltte***ctory
:public splitte***ctory};
class
main
void
method1()
}
我們可以看到,每乙個具體的類都有乙個對應的工廠,但是實現時,我們只需要建立乙個工廠。通過這樣的改良後,main不依賴具體類。
松耦合並不是把變化給消滅掉,而實際上是將它放在乙個區域性的地方。
現在來總結一下:
定義乙個用於建立物件的介面,讓字類決定例項化哪乙個類。factory method使得乙個類的例項化延遲(目的:解耦,手段:虛函式)到子類。
———《設計模式》gof
工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...
工廠方法模式(一) 簡單工廠方法模式
ps 第二篇學習部落格,堅持就是勝利。繼續設計模式的學習,記錄工廠模式,加深自己的理解。基本結構 abstractproduct 用來定義基本的商品的抽象 public abstract class abstractphoneproduct 用來實現抽象商品,生成各種商品 public class ...