設計模式中幾個工廠模式的比較——餐館的故事


初讀 Learning Hard大神的作品(C#設計模式總結 - Learning hard - 博客園),略有感觸。對創建型模式中的簡單工廠模式、工廠方法模式和抽象工廠模式這三個既有共性又有區別的模式加以比較,想出了一則生動有趣的故事以比喻之。在此與大家分享。

  最初,在小城里還沒有餐館,人們只能自己動手做飯吃。而自己做飯不專業,也沒有效率,也麻煩。正如沒有任何工廠類的時候,客戶端只能自己去創建類,每個不同的客戶端都這么創建類,自然就有很多重復的代碼,而且容易出錯。

  之后小城里有了餐館,人們只要進去點菜,就可以吃到自己想要的菜。這個餐館就是一個簡單工廠類,客戶端只要傳進去一個參數表示自己想要的類,簡單工廠就會返回這個類,這樣客戶端就輕松很多。

  隨着餐館的生意越來越好,來小城的食客也越來越多,食客要求的菜品也越來越多有要川菜、粵菜、魯菜等等,餐館不得不去招聘各種各樣的廚師來滿足這些需求。然而,樣樣精,就是樣樣都不精。正如餐館出現之前,人們自己做飯,不專業、沒效率、麻煩,一個包羅雜七雜八廚師的餐館也必然是不專業、沒效率、混亂。正如一個簡單工廠類,當其需要產出的產品類過多時,其內部結構也會復雜混亂。

  這個時候,小城里陸續有了其他餐館。沒錯!他們繼承自餐館,但是它們是川菜館、粵菜館、魯菜館等。這個時候食客們發現這些新餐館比原來的那個老餐館更加專業,只做一個菜系。因此這些新餐館變得更受歡迎。更可喜的是即使有一些老外慕名來到小城,他們也可以去街上新開的那家KFC而不會影響到其他餐館。這就是工廠方法模式帶來的好處,一個抽象工廠隨時可以按照客戶端的需求去實現一個新的工廠類來產生新的產品類來滿足客戶端新的要求。

  在小城里的一群老陝,最愛吃一家涼皮店的肉夾饃+涼皮+冰峰,因為這個組合有涼有熱、有吃有喝、有肉有菜。這天他們決定換換口味,去了家川菜館。拿到菜單之后,他們傻了眼,雖然可以想點哪個點哪個,但是他們並不清楚這些菜是用什么原料,是什么味道。最后瞎點一通,吃完不歡而散。即使他們可以咨詢其他人和店老板,對他們來說也比較麻煩是一種負擔。正如工廠方法模式可以按客戶端需求去創造產品類,但是還需要客戶自己去識別要產生哪些類,還要確定這些類的關系,甚是麻煩。

  為了解決這一問題,小城的餐館老板們聚在一起,根據各自的拿手好菜,討論抽象出了一個人人都愛的食物模式:有涼有熱、有吃有喝、有肉有菜。按照這個標准每家餐館都制定了自己的套餐來滿足這個標准。這下食客們可幸福了,他們只要選擇一家自己想要的餐館進去,就可以享受到滿足最佳食物模式的套餐,而不必糾結於具體點什么。這就是抽象工廠模式的好處,抽象工廠定義出了一個產品族及其關系以滿足客戶需求,那么按照這個定義出來的產品一定會滿足客戶端的需要。而客戶端只需要選擇一個產品族就可以,輕松愉快!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM