從設計模式的類型來說,簡單工廠模式是屬于創建性模式,又叫做靜態工廠方法模式,但不屬于23中[GOF](http://baike.baidu.com/link?url=uPsikCi-gAyc4SH5sLMa-a5VUL_tN9V9hzP5xGTvX7qhe4U7RybvWR56lvOVHC8H_uC3AbgubDoc6joxNMPTaq)設計模式之一,簡單的工廠模式是由一個工廠對象決定創建出哪一種產品類的實例,簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
那么到底什么是簡單工廠模式?我們中午在中快食堂吃飯,中快食堂滿足了我們的需求,這里的中快食堂就是一個簡單的工廠,在現實生活中工廠是負責生產產品的,,同樣在設計模式中,簡單工廠模式我們也可以理解為負責生產對象的一個類,我們平常編程中,當使用new關鍵字創建一個對象時,此時該類就依賴與這個對象,也就是她們之間的耦合度高,當需求變化時,我們就不得不去修改此類的源碼,此時我們可以運用oo很重要的原則去解決這一問題,該原則就是封裝改變,自然也就要找到改變的代碼,然后把改變的代碼用類來封裝,這樣的一種思路也就是我們簡單工廠模式的實現方式了,舉個生活中的例子。
寒暑假食堂沒有開門,提高班的孩子,有的在外面吃飯,當然手巧的孩子也可以自己在家做飯吃,但是自己要做飯比較麻煩哈,因為要去元辰超市買菜,油鹽醬醋肯定少不了,然而,也可以選擇去九之巢,燒餅,灌餅,煎餅隨你挑,這里,每個小攤位就充當簡單工廠的角色,那么這些生活中我們每天都在經歷的事情,在我們的編程世界中又是如何實現的呢。
自己做飯的情況:
~~~
///???
///?自己做飯的情況??
///?沒有簡單工廠之前,客戶想吃什么菜只能自己炒的??
///???
public?class?Customer??
{??
????///???
????///?燒菜方法??
????///???
????///???
????///???
????public?static?Food?Cook(string?type)??
????{??
????????Food?food?=?null;??
????????//?珊珊說:我想吃酸辣土豆絲怎么辦???
????????//?瀾瀾說:那你就自己燒啊!??
????????//?珊珊說:?好吧,那就自己做吧!??
????????if?(type.Equals("酸辣土豆絲"))??
????????{??
????????????food?=?new?ChiliSourPotato();??
????????}??
????????//?我還想吃土姜汁皮蛋,?這個還是得自己做??
????????//?我覺得自己做好麻煩,如果能有人幫我做就好了???
????????else?if?(type.Equals("姜汁皮蛋"))??
????????{??
????????????food?=?new?PreservedEggSinGingerSauce();??
????????}??
????????return?food;??
????}??
???????static?void?Main(string[]?args)??
????{??
??????????
????????Food?food1?=?Cook("酸辣土豆絲");??
????????food1.Print();??
????????Food?food2?=?Cook("姜汁皮蛋");??
????????food1.Print();??
????????Console.Read();??
????}??
}??
///???
///?菜抽象類??
///???
public?abstract?class?Food??
{??
????//?輸出點了什么菜??
????public?abstract?void?Print();??
}??
///???
///?酸辣土豆絲這道菜??
///???
public?class??ChiliSourPotato?:?Food??
{??
????public?override?void?Print()??
????{??
????????Console.WriteLine("一份酸辣土豆絲!");??
????}??
}??
///???
///?姜汁皮蛋這道菜??
///???
public?class?PreservedEggSinGingerSauce?:?Food??
{??
????public?override?void?Print()??
????{??
????????Console.WriteLine("一份姜汁皮蛋");??
????}??
}??
~~~
毛爺爺打江山的時候說,自己動手風衣足食,緊張的學習之后,自己動手做事,也不失為美事一件,但是有時候重復做一件事兒,總想著要買什么菜啊,中午做什么啊,就會感到厭煩,保不準做飯的時候就會把鹽當成白糖,那午飯就......,所以,偶爾我們可以去小餐館,呼呼,這里的餐館就相當于簡單工廠,我們可以把這些操作交給餐館去做,此時消費者對菜的依賴關系從直接變成間接,這樣就實現了面向對象的另一個原則,降低對象之間的耦合度。每次去餐館吃飯,你想到了么?這個也可以在我們的編程世界中實現,代碼如下:?
? ? ??
~~~
///???
???///?顧客充當客戶端,負責調用簡單工廠來生產對象??
???///?即客戶點菜,廚師(相當于簡單工廠)負責燒菜(生產的對象)??
???///???
???class?Customer??
???{??
???????static?void?Main(string[]?args)??
???????{??
???????????//?客戶想點酸辣土豆絲??????????
???????????Food?food1?=?FoodSimpleFactory.ChiliSourPotatod("酸辣土豆絲");??
???????????food1.Print();??
??
???????????//?客戶想點一個姜汁皮蛋??
???????????Food?food2?=?FoodSimpleFactory.?PreservedEggSinGingerSauce("姜汁皮蛋");??
???????????food2.Print();??
??
???????????Console.Read();??
???????}??
???}??
??
???///???
???///?菜抽象類??
???///???
???public?abstract?class?Food??
???{??
???????//?輸出點了什么菜??
???????public?abstract?void?Print();??
???}??
??
???///???
???///?酸辣土豆絲這道菜??
???///???
???public?class?ChiliSourPotatod?:?Food??
???{??
???????public?override?void?Print()??
???????{??
???????????Console.WriteLine("一份酸辣土豆絲!");??
???????}??
???}??
??
???///???
???///?姜汁皮蛋這道菜??
???///???
???public?class?PreservedEggSinGingerSauce?:?Food??
???{??
???????public?override?void?Print()??
???????{??
???????????Console.WriteLine("一份姜汁皮蛋");??
???????}??
???}??
??
???///???
???///?簡單工廠類,?負責?炒菜??
???///???
???public?class?FoodSimpleFactory??
???{??
???????public?static?Food?CreateFood(string?type)??
???????{??
???????????Food?food?=?null;??
???????????if?(type.Equals("酸辣土豆絲"))??
???????????{??
???????????????food=?new?ChiliSourPotatod();??
???????????}??
???????????else?if?(type.Equals("姜汁皮蛋"))??
???????????{??
???????????????food=?new?PreservedEggSinGingerSauce();??
???????????}??
??
???????????return?food;??
???????}??
???}??
~~~
接著我們來介紹一下簡單工廠模式中的UML圖,通過前面我們知道,簡單工廠模式又叫靜態方法模式(因為工廠類都定義了一個靜態方法),由一個工廠類根據傳入的參數決定創建出哪一種產品類的實例(通俗點表達:通過客戶下的訂單來負責燒那種菜)。以上述去餐館吃飯為例,簡單工廠模式的UML圖如下:
? ? ? ? ?
通過楚廣明C#視頻的學習,對c#有了一定的了解,帶著這一點懵懵懂懂的了解,我走進了大鳥和小菜的世界,一個個短小精煉的小故事,一場場面向對象編程思維的舞蹈,成為了《大話設計模式》這本書最溫馨美麗的部分,喜歡那個好學,天真,執著的小菜,崇拜那個善于啟發,經驗老到的大鳥,就這樣,慢慢的靠近.........