簡單工廠
簡單工廠不是一個設計模式,反而比較像是一種編程習慣。
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的代碼中只需涉及抽象工廠,運行時將自動使用實際的工廠。
抽象工廠的每個方法實際上看起來都像是工廠方法。