工廠,又稱製造廠,是一類用以生產貨物的大型工業建築物。大部分工廠都擁有以大型機器或裝置構成的生產線。在世界近代史中泛指資本主義機器大生產,即使用機械化勞動代替手工勞動的資本主義工業場所。在我們設計模式中也生活著這麼一家人,他們分別是簡單工廠模式,工廠方法模式和抽象工廠模式,他們都是屬於建立型設計模式,這三種建立型模式都不需要知道具體類。我們掌握一種思想,就是在建立乙個物件時,需要把容易發生變化的地方給封裝起來,來控制變化(**變化,封裝**),以適應客戶的變動,專案的擴充套件。這三種模式按照可維護可擴充套件的特點來看,工廠方法模式是簡單工廠模式的進化,而抽象工廠模式,又是工廠方法模式的進化。
舉個簡單的例子,春天是播種的季節,我想此刻在我的家-美麗的遙遠的安徽,爺爺奶奶正在菜園子裡忙著種植蔬菜苗,如果,奶奶只想讓菜園單純的只要種上蔬菜就可以了,那麼就用簡單工廠,奶奶養育了四個兒女,大過年的一大家子人回來,奶奶總想讓那方團圓桌擺上各式各樣的菜餚,這個時候就需要用工廠方法才可以實現,就是把共有的東西抽象出來,菜的種類多了,需要的土地規模就會擴大,如果要擴大菜園子的規模,比如乙個在村頭,乙個在村尾,這樣工廠方法就無法實現了,就應當用抽象工廠,各種各樣的蔬菜,又組成乙個菜園子。接下來,依次來講解一下,三個工廠,依然以我們上述例子:
首先簡單工廠模式, 我們把簡單工廠模式比喻成菜園子,菜園子有他自己的屬性方法,他封轉了澆水,施肥,鋤草三個方法,要求類是客戶端,她只需要呼叫農活類和菜園子類就可以完成任務,而不需要 一次呼叫澆水,施肥,鋤草所以,實現了封裝。一起來看一下她的類圖:
如果菜園子中蔬菜的種類越來越多,比如過長豆角,黃瓜,葫蘆等這些蔬菜屬於攀藤類蔬菜,需要支撐架來支撐她們來進行持續生長,茄子,茼蒿這些蔬菜需要定時削剪叉枝,以保持主干支的養分,這個時候,我們就需要修改**,首先,我們需要增加支撐架,削剪的類,然後,在菜園子類中改變select或者是if條件分支語句,這樣,不僅增加了類,還需要修改原有的類,這樣一來,違背了開放-封閉原則,這也就是為什麼簡單工廠模式不能列入gof的23中模式的原因之一。
而此時,我們需要把簡單工廠模式中的「菜園子」類加以改進,讓她符合開放-封閉原則,也就是取出她的select case選擇分支語句,讓在增加方法的時候只需要新增類,這樣便符合開閉原則,而簡單工廠和工程方法的區別,也就在此,看看我們的類圖是如何實現的。
我們一直都在寫乙個菜園子的農作物,但是,如果需要寫村頭和村尾兩個菜園子的農作物,而且我們可以隨時切換知道兩個菜園子的農作物情況,那麼,我們就應該考慮擴充工廠方法模式,而需求不斷演化的過程中,我們就重構了乙個非常重要的設計模式:抽象工廠模式,類圖如下:
無論是簡單工廠模式、工廠模式還是抽象工廠模式,它們本質上都是將不變的部分提取出來,將可變的部分留作介面,以達到最大程度上的復用。拿乙個生產水杯(cup)的工廠舉例:起初,不用工廠模式,我必須在生產水杯之前知道水杯的材料和形狀等水杯的所有特徵才能生產,這就是我們的new cup();這個cup必須是具體的。
廠主發現同一形狀的被子,只是材料不同,如乙個是玻璃(glass)的,乙個是瓷(china)的,但是確要兩條生產線,顯然有資源浪費的嫌疑。現在廠主生產杯子時先不讓生產線知道我要產的是玻璃的還是瓷的,而是讓它在不知道具體材料的情況下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形狀的具體杯子了。所以就有了簡單工廠模式。原來是cup cup=new cup;現在是******cupfactory.createcup(string cupname),根據cup的名字生產cup,而createcup返回的是乙個實現了 cup介面或抽象類的具體cup。
簡單抽象工廠模式有乙個問題,就是當我現在想生產乙個同樣形狀的鐵杯時,工廠裡並沒有定義相應的處理流程,只能更改createcup方法,這就不合理了。我現在只是想生產鐵杯,你只要在最後的時候把玻璃原料換成鐵的不就行了嗎,幹嘛還要更改整條生產線呢?於是就有了工廠模式。原來生產線在生產模具的時候還要考慮是為玻璃杯生產的模具還是為鐵杯生產的模具,現在它不用管了。cupfactory.createcup()建立cup.cupfactory是介面或抽象類。實現它的具體子類會建立符合cup介面的具體cup。那麼現在廠主想要生產水壺(kettle),用工廠模式就不得不再造一條水壺生產線,能不能在水杯生產線同時生產水壺呢?這就是抽象工廠模式。在原cupfactory中加乙個createkettle()方法,用來生產水壺。設計之旅,未完待續......
工廠三世同堂
當需要乙個相同的介面,但裡面完成內容不同時,就可以用乙個工廠來產生其中的多個類的乙個例項。通俗說 用來生產同一等級結構中的任意產品 優點 物件導向。包含了必要的邏輯判斷,根據客戶端的選擇條件動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。缺點 新增新的東西需要修改工廠類。定義乙個用於建立...
設計模式學習筆記 之三 世上沒有一成不變的需求
一成不變的需求是什麼樣子!變化無處不在,變化無時不在,這就是現實,然願意用一顆紅心去面對這無盡的需求變化。如果你去請教一些軟體開發人員 對於從使用者那裡所獲得的需求,哪些是他們知道確實可靠的?他們經常會給你下面這樣的回答 需求總是不完整的 需求經常是錯誤的 需求 以及使用者 都會使人迷惑 需求不可能...
設計模式 之 三
一 單例模式 飽漢模式public class singlepattern2 return sp 餓漢模式public class singlepattern1 兩種模式差別在有沒有在類被載入時就給建立好物件,餓漢 即等不及了要吃東西所以要提前建立好物件,飽漢 正好相反 二 模板方法 給出演算法的骨...