除了new操作符以外還有其他的製造物件的方法。
使用new時,雖然是例項化了乙個具體類,確實是實現,而不是介面,但這樣做會使得**繫結具體類,導致**更脆弱,也更缺乏彈性。
這時引入乙個新的設計模式「工廠模式」
工廠模式是用來封裝物件的建立的。通過讓子類決定該建立的物件是什麼,來達到將物件建立的過程封裝的目的。其組成元素為:
建立者類:這是乙個抽象類,其定義了乙個抽象的工廠方法,讓子類實現此方法製造產品。建立者一般會包含依賴於抽象產品的**,而這些抽象產品由子類實現。建立者不需要知道在製造哪種具體產品。
產品類:工廠生產的產品,這也是乙個抽象類,具體的產品由各個子類決定。
注意:產品類與建立者類是平級關係。
定義:工廠方法模式定義了乙個建立物件的介面,但由子類決定要例項的類是哪乙個。工廠方法讓類把例項化推遲到子類,以減少**的依賴性,從而提高**的彈性。
注意:工廠方法讓子類決定要例項的類是哪乙個。這裡「決定」,並不是指模式允許子類本身在執行時做決定,而是在編寫建立者類時,不需要知道實際建立的產品是哪乙個。選擇了使用哪個子類,自然就決定了實際建立的產品是什麼。
注意:建立者類,不一定是抽象的。可以定義乙個預設的工廠方法來生產某些具體的產品,這樣的話,就算建立者沒有任何子類,依然可以建立產品。
設計原則:依賴倒置,要依賴抽象,不要依賴具體類
指導方針:
1) 變數不可以持有具體類的引用。
2) 不要讓類派生自具體類。
3) 不要覆蓋基類中已實現的方法。
抽象工廠允許客戶使用抽象的介面來建立一組相關的產品,而不需要知道實際產出的具體產品是什麼。
注意:工廠方法模式和抽象工廠模式雖然都是負責建立物件,但工廠方法模式是通過繼承的方式,而抽象工廠模式是通過物件的組合。
《Head first設計模式》學習筆記
開閉原則的意思是 對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的 實現乙個熱插拔的效果。簡言之,是為了使程式的擴充套件性好,易於維護和公升級。想要達到這樣的效果,我們需要使用介面和抽象類,後面的具體設計中我們會提到這點。黎克特制代換原則是物件導向設計的基本原則之一。黎克特制代...
headfirst設計模式
花了一周多一點的時間看完了headfirst的設計模式。看完之後有一種恍然大悟的感覺,仔細想想有覺得自己好像什麼也看懂。簡單說下對這本書的一點感悟吧,headfirst的書比較通俗易懂,之前看了四人幫的設計模式,看一半就有一種痛不欲生的感覺,自己水平有限,看不懂,也就沒在勉強自己了。對於模式其實簡單...
HeadFirst設計模式學習筆記02
執行時擴充套件,遠比編譯時繼承威力大。熟悉了裝飾的技巧,能夠在不改變任何底層 的情況下,給你的物件賦予新的職責。星巴茲starbuzz以擴張速度快聞名,準備更新訂單系統,以適應他們的飲料 要求。原先類的設計 現在想購買咖啡時,可以要求在其中加入各種調料,如蒸奶 steamed milk 豆漿 soy...