摘要:
每個男程式員可能都會夢想自己有很多妞,其實你真的有很多“妞”,這個“妞”就是“new”!代碼中我們經常需要new各種對象,new太多了,代碼混亂不好用而且不好維護,如何才能管理好這些“妞”呢?本文將為你介紹設計模式中的其中三種建立型模式。
作者:
張傳波
www.umlonline.org/school/
作者自述:
在高中時已經很喜歡coding,可惜沒有考上電腦相關的大學專業,但仍然偏執於寫程式,畢業後做了幾年的程式員,後來成為專案經理直到常務副總。熟悉的語言有Basic、VB、C#,一直遺憾的事情是沒有花時間去精通C++。很早就“看中”設計模式,但直到現在僅能在實際工作中實踐過其中幾種設計模式。所以,本文歡迎各位高手拍磚!
一、簡單工廠(不是模式的模式)
如果在代碼中經常要重複寫這段代碼,實在不太爽:
if (…...)
newObject = new TypeA(); //TypeA TypeB的父類一樣。
else if (…...)
newObject = new TypeB(); //TypeA TypeB的父類一樣。
……
你考慮怎樣改進?
這樣可不簡單!用一個靜態方法,根據傳入參數返回所需的對象便可,在每個需要用到這個對象的地方,這樣寫便可:
Object newObject = ObjectBuilder.CreateObject(string type);
類圖如下:
下載 (35.16 KB)2009-10-27 18:00
以上這個設計就是簡單工廠,簡單工廠不是23種模式中的一種,但在我們實際工作中經常會用到,簡單工廠是管理new的最常見方法。
在程式中new對象一般沒有這樣簡單,往往要根據不同的情況new不同的對象,並且要初始化對象,我們往往將這些工作“封裝”到某個方法裡面,通過這個方法直接得到需要的對象。
二、Factory 方法(Factory Method Pattern)
我在實際工作中還沒有用過Factory 方法,下面簡單談談我的理解,供大家參考。
類圖:
下載 (77.13 KB)2009-10-27 18:03
這個圖一下子不太好理解,我們先回顧一下簡單工廠,簡單工廠是通過一個方法來封裝new對象的動作,如果我們將new對象的動作封裝到一個類中,那麼這個類就可以看成是一個工廠,該工廠專門用來產生某些對象的。
有時候我們希望能生產蘋果、西瓜、葡萄等不同品種的水果,這樣一個工廠就不能滿足要求,我們需要分別做出蘋果工廠、西瓜工廠、葡萄工廠,需要蘋果時就調用蘋果工廠的CreateProduct()就搞定了。
但問題來了,我們希望程式不需要管是蘋果工廠還是西瓜工廠,總之是工廠就行了。這樣我們就需要將這些蘋果工廠、西瓜工廠、葡萄工廠抽象為水果工廠了,就好像中的ProductA_Factory,ProductB_Factory繼承了抽象類別Factory。
中無論是哪個工廠,生產的都是Product,Product、Factory已經被抽象,而ProductA_Factory實際生產的是ProductA1、ProductA2,ProductB_Factory實際生產的是ProductB1、ProductB2,注意中用了相同的顏色來表示哪個工廠生產哪些產品。
三、抽象工廠(Abstract Factory Pattern)簡介
我在實際工作中我也沒有用過抽象工廠,下面簡單談談我的理解,供大家參考。
類圖:
下載 (143.08 KB)2009-10-28 10:45
說明:圖中黃底色文字不是類圖的一部分,僅是用來說明的。
有時候我們希望能得到一系列對象,不是一個對象,這時我們可考慮用抽象工廠,抽象工廠中有多個方法,分別得到不同的對象。
如果僅是這樣,我們不需要對工廠進行抽象,抽象原廠模式中要將工廠及產品都定義為介面,其目的就是如果程式想不加區別地得多個不同系列的對象,這時就需要實現這些介面。
介面Factory定義了產生ProductA、ProductB的方法,如果需要產生更多的產品,可定義更多的方法。
ConcreteFactory1實現了Factory介面,該類專門生產ConcreteProductA1、ConcreteProductB1產品;同理ConcreteFactory2專門生產ConcreteProductA2、ConcreteProductB2產品。
這些具體工廠和產品都是實現了Factory、ProductA、ProductB介面的,故程式可以不加區別地處理。
電子書《硬啃設計模式》下載
本書介紹了我對23種設計模式的粗淺理解,本文的內容來自書中,有時間再分享更多書中內容。
以下是封面和部分目錄:
下載 (211.69 KB)2012-4-14 21:40
猛點以下連結直接下載電子書:
http://www.umlonline.org/school/attachment.php?aid=MTkxMXxlOWJlOTA2MHwxMzM2NjU2Mzc2fGQ0MDl4WWFwb1NUZU1EZWlMRzZmM1FTSW9MVWJWSnVYTGNid0ZnY24yYjM0Mmtn
如果本文對你有協助,麻煩點擊一下“推薦”,謝謝!