日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[设计模式篇]工厂模式和抽象工厂模式

發布時間:2025/3/20 asp.net 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [设计模式篇]工厂模式和抽象工厂模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在看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

總結

以上是生活随笔為你收集整理的[设计模式篇]工厂模式和抽象工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。