【HeadFirst設計模式】工廠模式

簡單工廠

簡單工廠不是一個設計模式,反而比較像是一種編程習慣。

Pizza簡單工廠類圖


PizzaStore是工廠的“客戶”,PizzaStore通過SimplePizzaFactory取得pizza實例。

SimplePizzaFactory類中的createPizza()方法通常爲靜態方法。

Pizza通常定義爲抽象類,具有一些有用的實現,這些實現可以被覆蓋。


工廠方法模式(Factory Method Pattern)

所有工廠模式都用來封裝對象的創建。工廠方法模式(Factory Method Pattern)通過讓子類決定該創建的對象是什麼,來達到將對象創建的過程封裝的目的。

創建者(Creator)類


PizzaStore爲抽象創建者類,它定義了一個抽象的工廠方法,讓子類實現此方法制造產品。

子類可以利用實現createPizza()創建自己風味的Pizza。


產品類


工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法把類的實例化推遲到子類。

類圖


所有的產品都必須實現一個共同的接口(Product),這樣一來,使用這些產品的類就可以引用這個接口,而不是具體類。

Creator是一個類,它實現了所有操縱產品的方法,但不實現工廠方法。而將工廠方法交給子類去實現。


設計原則(依賴倒置原則【Dependency Inversion Principle】):要依賴抽象,不要依賴具體類。

不能讓高層組件依賴低層組件,而且,不管高層或低層組件,“兩者”都應該依賴抽象。

所謂“高層”組件,是由其他低層組件定義其行爲的類。例如,PizzaStore是“高層組件”,因爲它的行爲是由Pizza定義的:PizzaStore創建所有不同的比薩對象,準備、烘烤、切片、裝盒;而Pizza本身屬於“低層組件”,具體的Pizza和PizzaStore都實現了Pizza接口。

下面的方針,能避免在OO設計中違反依賴倒置原則:

變量不可以持有具體類的引用;(使用new就回持有具體類的引用)

不要讓類派生自具體類;(如果派生自具體類,就會依賴具體類)

不要覆蓋基類中已實現的方法;

應該儘量達到這些原則,而不是隨時都要遵循這個原則,我們都很清楚,任何Java程序都有違反這些指導方針的地方。


抽象工廠模式提供了一個接口,用於創建相關或依賴對象的家族,而不需要明確指定具體類。


AbstractFactory定義了一個接口,所有的具體工廠都必須實現此接口,這個接口包含了一組方法用來生產產品。

ConcreteFactory實現了產品家族。要創建一個產品,客戶只要使用其中的一個工廠而完全不需要實例化任何產品對象。每個具體工廠都能夠生產一整組的產品。

Client的代碼中只需涉及抽象工廠,運行時將自動使用實際的工廠。

抽象工廠的每個方法實際上看起來都像是工廠方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章