文章轉(zhuǎn)自: 常用設(shè)計模式的一些優(yōu)缺點
1 簡單工廠模式(Static Factory Method)
適用場景
工廠類負責創(chuàng)建的對象比較少衩椒。
客戶只知道傳入工廠類的參數(shù)境钟,對于如何創(chuàng)建對象(邏輯)不關(guān)心堰燎。
由于簡單工廠很容易違反高內(nèi)聚責任分配原則析苫,因此一般只在很簡單的情況下應(yīng)用萌狂。
優(yōu)點
工廠類是整個模式的關(guān)鍵。包含了必要的邏輯判斷躏率,根據(jù)外界給定的信息躯畴,決定究竟應(yīng)該創(chuàng)建哪個具體類的對象。
通過使用工廠類薇芝,外界可以從直接創(chuàng)建具體產(chǎn)品對象的尷尬局面擺脫出來蓬抄,僅僅需要負責“消費”對象就可以了。而不必管這些對象究竟如何創(chuàng)建及如何組織的夯到。明確了各自的職責和權(quán)利嚷缭,有利于整個軟件體系結(jié)構(gòu)的優(yōu)化。
缺點
由于工廠類集中了所有實例的創(chuàng)建邏輯耍贾,違反了高內(nèi)聚責任分配原則峭状,將全部創(chuàng)建邏輯集中到了一個工廠類中,它所能創(chuàng)建的類只能是事先考慮到的逼争,如果需要添加新的類,則就需要改變工廠類了劝赔。
當系統(tǒng)中的具體產(chǎn)品類不斷增多時候誓焦,可能會出現(xiàn)要求工廠類根據(jù)不同條件創(chuàng)建不同實例的需求。這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯在一起着帽,很難避免模塊功能的蔓延杂伟,對系統(tǒng)的維護和擴展非常不利。
這些缺點在工廠方法模式中得到了一定的克服仍翰。
2 策略模式(Strategy)
適用場景
多個類有不同的表現(xiàn)形式赫粥,每種表現(xiàn)形式可以獨立成單獨的算法。
需要再不同情況下使用不同的算法予借,以后算法可能還會增加越平。
對用戶隱藏算法邏輯频蛔。
優(yōu)點
每個算法單獨封裝,減少了算法和算法調(diào)用者的耦合秦叛。
合理使用繼承有助于提取出算法中的公共部分晦溪。
簡化了單元測試。
缺點
策略模式只適用于客戶端知道所有的算法或行為的情況挣跋。
策略模式造成很多的策略類三圆,每個具體策略類都會產(chǎn)生一個新類。不過可以使用享元模式來減少對象的數(shù)量避咆。
3 裝飾模式(Decorator)
適用場景
需要擴展一個類的功能舟肉,或給一個類添加附加職責。
需要動態(tài)的給一個對象添加功能查库,這些功能可以再動態(tài)的撤銷路媚。
需要增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能,從而使繼承關(guān)系變的不現(xiàn)實膨报。
當不能采用生成子類的方法進行擴充時磷籍。一種情況是,可能有大量獨立的擴展现柠,為支持每一種組合將產(chǎn)生大量的子類院领,使得子類數(shù)目呈爆炸性增長。另一種情況可能是因為類定義被隱藏够吩,或類定義不能用于生成子類比然。
優(yōu)點
Decorator模式與繼承關(guān)系的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性周循。
通過使用不同的具體裝飾類以及這些裝飾類的排列組合强法,設(shè)計師可以創(chuàng)造出很多不同行為的組合。
缺點
這種比繼承更加靈活機動的特性湾笛,也同時意味著更加多的復(fù)雜性饮怯。
裝飾模式會導(dǎo)致設(shè)計中出現(xiàn)許多小類,如果過度使用嚎研,會使程序變得很復(fù)雜蓖墅。
裝飾模式是針對抽象組件(Component)類型編程。但是临扮,如果你要針對具體組件編程時论矾,就應(yīng)該重新思考你的應(yīng)用架構(gòu),以及裝飾者是否合適杆勇。當然也可以改變Component接口贪壳,增加新的公開的行為,實現(xiàn)“半透明”的裝飾者模式蚜退。在實際項目中要做出最佳選擇闰靴。
4 代理模式(Proxy)
適用場景
遠程代理彪笼,為一個對象在不同的地址空間提供局部代表,這樣就可以隱藏一個對象存在于不同地址空間的事實传黄。
虛擬代理杰扫,是根據(jù)需要創(chuàng)建開銷很大的對象。通過它來存放實例化需要很長時間的真是對象膘掰。
安全代理章姓,用來控制真實對象訪問時的權(quán)限。
智能指引识埋,是指當調(diào)用真是的對象時凡伊,代理處理另外的一些事情。
優(yōu)點
職責清晰窒舟,真實的角色就是實現(xiàn)實際的業(yè)務(wù)邏輯系忙,不用關(guān)心其他非本職責的事務(wù),通過后期的代理完成一件完成事務(wù)惠豺,附帶的結(jié)果就是編程簡潔清晰银还。
代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用洁墙。
高擴展性
缺點
在客戶端和目標對象增加一個代理對象蛹疯,會造成請求處理速度變慢。
增加了系統(tǒng)的復(fù)雜度热监。
5 工廠方法模式(Factory Method)
適用場景
工廠方法模式是new一個對象的替代品捺弦,所以在所有需要生成對象的地方都可以使用,但是需要慎重地考慮是否要增加一個工廠類進行管理孝扛,增加代碼的復(fù)雜度列吼。
需要靈活的、可擴展的框架時苦始,可以考慮采用工廠方法模式寞钥。
工廠方法模式可以用在異構(gòu)項目中,例如通過WebService與一個非Java的項目交互陌选,雖然WebService號稱是可以做到異構(gòu)系統(tǒng)的同構(gòu)化凑耻,但是在實際的開發(fā)中,還是會碰到很多問題柠贤,如類型問題、WSDL文件的支持問題类缤,等等臼勉,從WSDL中產(chǎn)生的對象都認為是一個產(chǎn)品,然后由一個具體的工廠類進行管理餐弱,減少與外圍系統(tǒng)的耦合宴霸。
可以使用在測試驅(qū)動開發(fā)的框架下囱晴,例如,測試一個類A瓢谢,就需要把與類A有關(guān)聯(lián)關(guān)系的類B也同時產(chǎn)生出來畸写,我們可以使用工廠方法模式把類B虛擬出來,避免類A與類B的耦合氓扛。目前由于JMock和EasyMock的誕生枯芬,該使用場景已經(jīng)弱化了,讀者可以在遇到此種情況時直接考慮使用JMock或EasyMock采郎。
優(yōu)點
良好的封裝性千所,代碼結(jié)構(gòu)清晰,減少模塊間的耦合蒜埋。
工廠方法模式的擴展性非常優(yōu)秀淫痰。
屏蔽產(chǎn)品類。
工廠方法模式是典型的解耦框架整份。
缺點
使用者必須知道相應(yīng)工廠的存在待错。
每次增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠烈评,是的系統(tǒng)中類的個數(shù)成倍增加火俄,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴础倍。
6 原型模式(Prototype)
適用場景
某些結(jié)構(gòu)復(fù)雜的對象的創(chuàng)建工作烛占;由于需求的變化,這些對象經(jīng)常面臨著劇烈的變化沟启,但是他們卻擁有比較穩(wěn)定一致的接口忆家。
一般在初始化的信息不發(fā)生變化的情況下,克隆是最好的方法德迹。
優(yōu)點
隱藏了對象創(chuàng)建的細節(jié)芽卿。
提高了性能。
不用重新初始化胳搞,動態(tài)獲得對象運行時的狀態(tài)卸例。
缺點
適用性不是很廣。
每一個類必須配備一個克隆方法肌毅。
配備克隆方法需要對類的功能進行通盤考慮筷转,這對于全新的類不是很難,但對于已有的類不一定很容易悬而,特別當一個類引用不支持串行化的間接對象呜舒,或者引用含有循環(huán)結(jié)構(gòu)的時候。
7 模板方法模式(Template Method)
適用場景
適用于子類中有重復(fù)的代碼笨奠,可以把重復(fù)代碼提取出來袭蝗,放到父類中唤殴。
優(yōu)點
提高代碼復(fù)用性。
幫助子類擺脫重復(fù)的不變行為到腥。
缺點
考慮不全面統(tǒng)一出現(xiàn)問題朵逝。