常用設(shè)計模式的一些優(yōu)缺點

文章轉(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)問題朵逝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乡范,隨后出現(xiàn)的幾起案子配名,更是在濱河造成了極大的恐慌,老刑警劉巖篓足,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段誊,死亡現(xiàn)場離奇詭異,居然都是意外死亡栈拖,警方通過查閱死者的電腦和手機连舍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涩哟,“玉大人索赏,你說我怎么就攤上這事√耍” “怎么了潜腻?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器仗。 經(jīng)常有香客問我融涣,道長,這世上最難降的妖魔是什么精钮? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任威鹿,我火速辦了婚禮,結(jié)果婚禮上轨香,老公的妹妹穿的比我還像新娘忽你。我一直安慰自己,他們只是感情好臂容,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布科雳。 她就那樣靜靜地躺著,像睡著了一般脓杉。 火紅的嫁衣襯著肌膚如雪糟秘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天球散,我揣著相機與錄音尿赚,去河邊找鬼。 笑死,一個胖子當著我的面吹牛吼畏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘁灯,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼泻蚊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丑婿?” 一聲冷哼從身側(cè)響起性雄,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羹奉,沒想到半個月后秒旋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡诀拭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年迁筛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耕挨。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡细卧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筒占,到底是詐尸還是另有隱情贪庙,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布翰苫,位于F島的核電站止邮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奏窑。R本人自食惡果不足惜导披,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望良哲。 院中可真熱鬧盛卡,春花似錦、人聲如沸筑凫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巍实。三九已至滓技,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棚潦,已是汗流浹背令漂。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叠必。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓荚孵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纬朝。 傳聞我的和親對象是個殘疾皇子收叶,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用共苛、多...
    MinoyJet閱讀 3,922評論 1 15
  • 設(shè)計模式基本原則 開放-封閉原則(OCP)判没,是說軟件實體(類、模塊隅茎、函數(shù)等等)應(yīng)該可以拓展澄峰,但是不可修改。開-閉原...
    西山薄涼閱讀 3,777評論 3 14
  • 參考資料:菜鳥教程之設(shè)計模式 設(shè)計模式概述 設(shè)計模式(Design pattern)代表了最佳的實踐辟犀,通常被有經(jīng)驗...
    Steven1997閱讀 1,170評論 1 12
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,340評論 8 265
  • 一 米婭一身湖水藍的絲綢連衣裙俏竞,站在大大的落地窗前,腰身被高高的束起踪蹬,系著一個天藍色的蝴蝶結(jié)胞此,下擺的周圍是一圈雪白...
    徐冊冊閱讀 604評論 2 18