[设计模式篇]工厂模式和抽象工厂模式
最近在看Head First的Design Pattern,想想去年候捷來學校給我們講Design Pattern,但當時水平太弱根本聽不懂,今年想趁機再好好學一波,候捷反而不來了,哎,人生就是這樣,有些機會真的搞不好只有一次了,所以還是要多多珍惜,不然... ... (再水下去估計沒人看了,廢話少說,這篇就當一個開篇之作吧,雖然已經看了不少了。)
Head First這本書用了一個披薩店的例子,從簡單工廠(嚴格來說這不算一種Gof的設計模式,更像是一種編程習慣),到介紹工廠模式,再介紹到抽象工廠模式,最后予以總結,個人認為這種結合具體事例來說事的學習方法是非常值得推崇的,這里先對這段過程簡單描述一下:
1.假設我們開了一個披薩店,我們會賣各種各樣的披薩,我們最開始想到的方法可能就是創建一個基本的Pizza父類,然后通過繼承產生我們披薩店賣的各種各樣的披薩子類,比如CheesePizza,GreekPizza... ...那么我們在決定生產一個披薩(調用orderPizza)時,我們首先想到的方法是把披薩的類型當作一個參數傳給orderPizza,然后寫一堆的if else,比如
if (type.equals("Cheese")
//新建一個CheesePizza
else if....(我盡量少些代碼,因為都比較好理解)
這就是一個最基本的實現,但隨著pizza類型的增多,我們改起來的壓力也越來越大,需要不停的使用 if else顯然不是一種最佳實踐,這是我們就引入“工廠”的概念了;
2.所謂“工廠”,就是為處理創建對象的細節建立的,這里我們的Pizza就可以看作是一個工廠,我們知道它生產Pizza(可能Pizza和披薩混用,大家理解就好),對于上面的情況,我們可以創建一個SimplePizzaFactory(也就是“簡單披薩工廠”)將我們需要實例化的Pizza對象扔進去,也就是將那一堆if else放到這里來實現,也就是將創建披薩的代碼包裝進一個類,以后實現改變時,只需要修改這個類即可,ok,這就是簡單工廠的思維。。。。有木有太簡單了一點,這么簡單的想法怎么能算一種高大上的Design Pattern呢?所以它真的不算設計模式的一種,但這種將變化的部分抽取出來的思維個人感覺是很有必要掌握的,然后繼續我們的故事;
3.隨著你披薩店的發展,現在出現了不同地方的店像要加盟,比如有上海的,有北京的,有深圳的,不同的店制作的披薩不同,假設上海披薩薄,多汁啥的,北京披薩厚,芝士放得多... ...(就知道它們有區別就行了),這個時候為了滿足不同地方的需求,我們需要分別為這三個地方創建不同的披薩店(披薩工廠),分別是ShanghaiPizzaStore,BeijingPizzaStore,ShenZhenPizzaStore,對應不同的披薩店生產不同的披薩(具體的實現細節先不管),在具體的調用中,我們先創建一個具體的披薩店,然后通過這個披薩店傳入的參數(比如cheese)來實例化一個披薩,這個過程用以下兩行代碼:
PizzaStror shStore = new ShanghaiPizzaStore();
Pizza pizza = shStore.orderPizza("cheese");
這樣就實例化了一個上海披薩店的起司披薩對象,這很簡單,但客官您看好了,這里就引入了設計模式的概念了,對于一個工廠方法來說,我們有兩個平行的類層級--產品類和創建者類,這里的產品類就是我們的Pizza,創建者類就是我們的PizzaStore,工廠方法模式“定義了一個創建對象的接口,但由子類決定要實例化的類是那一個。工廠方法讓類把實例化推遲到了子類(Define an interface for creating a?single?object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses?)”,它幫助我們將產品的“實現”從“使用”中解耦,也就是說,當我們的產品類受到影響時(披薩種類的增加啥的),我們的創建者PizzaStore并不會受到什么影響,它只負責去這個Pizza工廠中取具體的Pizza,這就時工廠方法模式的基本應用了。(更深入的了解可以去查一查“Dependency Inversion Principle”,大名鼎鼎的“依賴倒置原則”,我也理解得不是很深,暫且按下不表);
4.好了,我們的工廠(產品)類有了,創建者也有了,那抽象工廠又是個什么東東呢?我們回到pizza店,考慮這樣一種情況,北京的披薩店和上海的披薩店,它們不但生產的披薩種類不同,這些披薩的原料也不同,也就是實例化一個披薩時,我們要根據其地域來對它的面團,醬料啊具體分析,這個時候怎么辦呢?我們這是可以通過定義一個原料工廠的接口,然后在各地域的披薩店里實現這個接口,比如有上海披薩原料工廠,北京披薩原料工廠... ...這樣當我們知道我們的披薩店之后,就可以實例化一個具體的原料工廠,這樣就可以提取原料來制作對應的披薩了!沒錯,這就是抽象工廠的思想--"提供一個接口,用于創建相關或依賴對象的家族,而不需要明確指定具體類";這里的原料就是一個接口,當我們的創建者確定之后,這個對應的接口也就被對應地實現了,這樣創建者就可以從這個工廠中去取我們的披薩原料了,通過這樣的組合來完成披薩的制作。
。。。。已經快兩點了,明早還有課,介紹就到這里,其實Head First也差不多在這里結束了這張,具體工廠方法模式和抽象工廠的應用,讀者可以去參考更多例子。因為我也是初學者,理解肯定不全,我這樣記錄下來更多是希望大家一起來探索,于反復交流中探取真知,學習不就是這樣么?好了,不廢話了,歡迎交流,第一篇先到這里。
轉載于:https://www.cnblogs.com/krischan/p/5406606.html
總結
以上是生活随笔為你收集整理的[设计模式篇]工厂模式和抽象工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制作引导页[3]
- 下一篇: asp.net ajax控件工具集 Au