“妞”太多,如何管理?—— 三種創建型設計模式


摘要:
每個男程序員可能都會夢想自己有很多妞,其實你真的有很多“妞”,這個“妞”就是“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);

類圖如下:

簡單工廠1.png



以上這個設計就是簡單工廠,簡單工廠不是23種模式中的一種,但在我們實際工作中經常會用到,簡單工廠是管理new的最常見方法。

在程序中new對象一般沒有這樣簡單,往往要根據不同的情況new不同的對象,並且要初始化對象,我們往往將這些工作“包裝”到某個方法里面,通過這個方法直接得到需要的對象。

 

二、工廠方法(Factory Method Pattern)

 

我在實際工作中還沒有用過工廠方法,下面簡單談談我的理解,供大家參考。

類圖

工廠方法1.png



這個圖一下子不太好理解,我們先回顧一下簡單工廠,簡單工廠是通過一個方法來包裝new對象的動作,如果我們將new對象的動作包裝到一個類中,那么這個類就可以看成是一個工廠,該工廠專門用來產生某些對象的。

有時候我們希望能生產蘋果、西瓜、葡萄等不同品種的水果,這樣一個工廠就不能滿足要求,我們需要分別做出蘋果工廠、西瓜工廠、葡萄工廠,需要蘋果時就調用蘋果工廠的CreateProduct()就搞定了。

但問題來了,我們希望程序不需要管是蘋果工廠還是西瓜工廠,總之是工廠就行了。這樣我們就需要將這些蘋果工廠、西瓜工廠、葡萄工廠抽象為水果工廠了,就好像上圖中的ProductA_Factory,ProductB_Factory繼承了抽象類Factory。

上圖中無論是哪個工廠,生產的都是Product,Product、Factory已經被抽象,而ProductA_Factory實際生產的是ProductA1、ProductA2,ProductB_Factory實際生產的是ProductB1、ProductB2,注意上圖中用了相同的顏色來表示哪個工廠生產哪些產品。

 

三、抽象工廠(Abstract Factory Pattern)簡介

 

我在實際工作中我也沒有用過抽象工廠,下面簡單談談我的理解,供大家參考。

類圖

抽象工廠1.png



說明:圖中黃底色文字不是類圖的一部分,僅是用來說明的。

有時候我們希望能得到一系列對象,不是一個對象,這時我們可考慮用抽象工廠,抽象工廠中有多個方法,分別得到不同的對象。
如果僅是這樣,我們不需要對工廠進行抽象,抽象工廠模式中要將工廠及產品都定義為接口,其目的就是如果程序想不加區別地得多個不同系列的對象,這時就需要實現這些接口。

接口Factory定義了產生ProductA、ProductB的方法,如果需要產生更多的產品,可定義更多的方法。
ConcreteFactory1實現了Factory接口,該類專門生產ConcreteProductA1、ConcreteProductB1產品;同理ConcreteFactory2專門生產ConcreteProductA2、ConcreteProductB2產品。
這些具體工廠和產品都是實現了Factory、ProductA、ProductB接口的,故程序可以不加區別地處理。

 

電子書《硬啃設計模式》下載

本書介紹了我對23種設計模式的粗淺理解,本文的內容來自書中,有時間再分享更多書中內容。

以下是封面和部分目錄:

封面.png



目錄.png


猛點以下鏈接直接下載電子書:
http://www.umlonline.org/school/attachment.php?aid=MTkxMXxlOWJlOTA2MHwxMzM2NjU2Mzc2fGQ0MDl4WWFwb1NUZU1EZWlMRzZmM1FTSW9MVWJWSnVYTGNid0ZnY24yYjM0Mmtn

 

如果本文對你有幫助,麻煩點擊一下“推薦”,謝謝!

 

 


免責聲明!

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



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