本文出自
在簡單工廠模式的******factory, 你確實可以建立比薩,但是其他部分:烘烤,切片等可能不同的店會有不同的差異。
如果我們要在其他地方開比薩店,比如在北京開比薩店,那麼北京的製作比薩是不一樣風格的,使用這個類的話,可能就要修改**。所以把製作比薩的**綁在pizzastore裡,這樣做沒有彈性。
那麼要怎樣做呢?
我們可以把createpizza()放回pizzastore中,不過要把它設定成「抽象方法」,然後為每個不同地方的比薩店建立乙個pizzastore的子類:
有了乙個pizzastore的抽象類,讓不同地方的比薩店都繼承這個pizzastore,每個子類各自決定如何製造比薩。
注意!這個做法是讓pizzastore的各個子類負責定義自己的createpizza()方法,這實際上是把決定推遲到了子類
記住,把決定推遲到了子類
,這是工廠模式的重要特徵!
現在我們來實現乙個子類,建立乙個芝加哥的比薩店:
public class chicagopizzastore extends pizzastore else if (item.equals("veggie")) else if (item.equals("clam")) else if (item.equals("pepperoni")) else return null;
}}
子類只要實現createpizza就可以了,這樣子類可以自己決定要建立什麼物件,而不用管其他東西,就很靈活了。
工廠方法模式定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。 工廠方法讓類把例項化推遲到子類。
工廠方法模式能夠封裝具體型別的例項化,看下面類圖,抽象的creator提供了乙個建立物件的方法的介面,也稱為「工廠方法」。在抽象的creator中,任何其他實現的方法,都可能用到這個工廠所製造出來的產品,但只有子類真正實現這個工廠方法並建立產品。
要依賴抽象,不要依賴具體類
看下面這個不使用工廠模式的比薩店,看它依賴了多少個具體類。
當直接例項化乙個物件時,就是在依賴它的具體類。
我們已經知道了「要針對介面程式設計,而不要針對具體程式設計」原則, 和依賴倒置原則原則很像,但是這裡更強調「抽象」。
這個原則說明了:不能讓高層元件以來低層元件,而且不管高層或低層元件,「兩者」都應該依賴於抽象
所謂「高層」元件,是由其他低層元件定義其行為的類。例如,pizzastore 是高層元件,因為它的行為是由比薩定義的:pizzastore建立所有不同的比薩物件,而比薩本身屬於低層元件。
在這個「比薩圖」中,pizzastore是「高層元件」,而比薩實現是「低層元件」, pizzstore依賴於這些具體比薩類。
我們應用「依賴倒置」原則來改變上面的類:
使用工廠方法後,高層元件(pizzastore)和低層元件(那些具體比薩)都依賴了pizza的抽象。
先要遵循依賴倒置原則,工廠方法並非是唯一的技巧,卻是最有為例的技巧之一。
下面的知道方針可以幫助避免在oo設計中違反依賴倒置原則:
1. 變數不可以持有具體類的引用。
如果使用new,就會持有具體類的引用,可以改用工廠來避開這樣的做法。
2. 不要讓類派生自具體類
如果派生自具體類,就會依賴這些具體類。請派生自乙個抽象介面或抽象類。
3. 不要覆蓋基類中已實現的方法。
如果覆蓋基類已實現的方法,那麼你的基類就不是乙個真正適用被繼承的物件。基類中已實現的方法,應該由所有的子類共享。
設計模式 工廠模式(學習筆記)
披薩專案 要方便專案的擴充套件,要便於維護 要能執行時擴充套件。披薩族設計 不足之處 披薩只能prepare bake cut box操作,增加新功能需要更改原始抽象類,程式擴充套件性低。簡單工廠模式的設計方案 定義乙個例項化披薩物件的類,封裝建立物件的 將例項部分與抽象超類分隔開,放在工廠裡提高擴...
設計模式學習系列5 工廠模式
1 前言 先介紹一下物件導向設計的原則 1 ocp 開放關閉原則 軟體對擴充套件是開放的 對修改是關閉的,核心思想 對抽象程式設計,不對實現程式設計 2 dip 依賴倒轉原則 依賴於抽象,而不依賴實現 3 lsp 李氏替換原則 子類都可以替換父類 2 工廠模式構成 uml圖中,所有具體的工廠都從抽象...
設計模式學習系列5 工廠模式
1 前言 先介紹一下物件導向設計的原則 1 ocp 開放關閉原則 軟體對擴充套件是開放的 對修改是關閉的,核心思想 對抽象程式設計,不對實現程式設計 2 dip 依賴倒轉原則 依賴於抽象,而不依賴實現 3 lsp 李氏替換原則 子類都可以替換父類 2 工廠模式構成 uml圖中,所有具體的工廠都從抽象...