資源描述:
《哪些設(shè)計(jì)模式最值得學(xué)習(xí)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、回想起來,這幾年在園子里發(fā)布的有關(guān)設(shè)計(jì)模式的隨筆都有一個(gè)共同的特點(diǎn)。那就是Factory和Singleton居多,如果是系列的,也往往是從這兩個(gè)模式開始的。由于能夠堅(jiān)持把《設(shè)計(jì)模式》中所有模式都寫完的非常少,所以基本上也很少見到有關(guān)其它模式的隨筆?! ∵@種情況也很好理解,因?yàn)椤对O(shè)計(jì)模式》這本書就是按照這個(gè)順序來的。最先講述的就是AbstractFactory模式,于是它排第一也無可厚非;排第二的Builder基本不太容易見到;第三的FactoryMethod由于也叫“Factory”所以往往和AbstractFactory放在一起,或者干脆就
2、混淆了;第四的Prototype也不是太容易見到;第五位的Singleton簡單易懂,易學(xué)易用。而再往后的模式,恐怕作者們就沒什么耐心學(xué)下去了……這可能就是為什么Factory和Singleton出現(xiàn)頻率如此之多的原因吧。 《設(shè)計(jì)模式》已經(jīng)出版超過15年了,到今天已經(jīng)不是什么新鮮的東西了,可以說正在由“絕招”慢慢向著“基本功”轉(zhuǎn)變著。然而,這種學(xué)習(xí)模式的方式方法卻實(shí)在令人擔(dān)憂?! bstractFactory在實(shí)際中并不常見,因?yàn)樗枰阌袃商撞⑿械睦^承體系,需要對同一個(gè)抽象有多于一種的實(shí)現(xiàn)方式。這種復(fù)雜的系統(tǒng)可以說不是每個(gè)領(lǐng)域,每個(gè)開發(fā)
3、人員都能遇到的。在某些特定的領(lǐng)域可能很常見,但是在大多數(shù)領(lǐng)域并不需要這么復(fù)雜的對象創(chuàng)建方法。這就造成了很多人“殺雞用宰牛刀”,用復(fù)雜的方式,解決不那么復(fù)雜的問題。后果是增加了不必要的復(fù)雜度,給系統(tǒng)維護(hù)增加了困難。 另一個(gè)模式Singleton,由于實(shí)現(xiàn)簡單,意圖“似乎”也很明顯。被很多人用來作為“優(yōu)化”的一種方式。通過這種方式來節(jié)省內(nèi)存空間,減少對象實(shí)例。但是單一實(shí)例本身就等同于全局變量,而全局變量在幾十年前就已經(jīng)被證明是“反模式”了,用另一種形態(tài)的全局變量來代替另一種形態(tài)的全局變量有什么好處么?問題在與,Singleton的“意圖”并不在
4、于優(yōu)化,而是在于“妥協(xié)”。Singleton的目的在于保證對象有單一的實(shí)例,這是因?yàn)閷ο蟊仨氁袉我坏膶?shí)例,如果存在多個(gè)實(shí)例,可能會引發(fā)錯(cuò)誤。也就是說,Singleton以犧牲程序的清晰和可維護(hù)性,來達(dá)到保證程序正確的目的。這跟本就和優(yōu)化八竿子打不著,這完全是一種設(shè)計(jì)上的妥協(xié),犧牲一些好處來獲取更大的好處。如果僅僅是為了節(jié)省幾個(gè)對象實(shí)例,而非程序的正確才使用Singleton,那就是丟了西瓜揀芝麻。況且節(jié)省那幾個(gè)實(shí)例也跟本就不可能對程序的性能有太大的影響(特殊領(lǐng)域除外)?! ∪说臅r(shí)間是有限的,23個(gè)模式也不是都那么常用,哪些模式才是最經(jīng)常用到
5、的,才是最值得學(xué)習(xí)的呢? 第一梯隊(duì):Iterator,Observer,TemplateMethod,Strategy Iterator:LINQ,foreach這不都是Iterator么?! bserver:MVC的核心,.NET中事件就是Observer?! trategy:對同一個(gè)行為有不同實(shí)現(xiàn)的時(shí)候,如果考慮將行為的實(shí)現(xiàn)委托(不是.NET中的委托)給另一個(gè)類,那就用到了Strategy。通過這種方式,可以簡單的替換算法的實(shí)現(xiàn)類,來達(dá)到更換算法的目的。classFoo{privateIBarbar;publicFoo(IBarb
6、ar){this.bar=bar;}publicvoidDoSomething(){//somecodebar.DoWhatYouWant();//somecode}}classA:IBar{publicvoidDoWhatYouWant(){//doinA'sway}}classB:IBar{publicvoidDoWhatYouWant(){//doinB'sway}}TemplateMethod:一個(gè)算法的同一個(gè)步驟有不同的實(shí)現(xiàn),通過繼承來實(shí)現(xiàn)。這種方式通過創(chuàng)建子類來改變算法的實(shí)現(xiàn)和行為。ASP.NETWebForm中Page的OnIn
7、it,OnLoad等事件,就是TemplateMethod。classFoo{publicvoidDoSomething(){//somecodeDoWhatYouWant();//somecode}protectedabstractvoidDoWhatYouWant();}classA:Foo{protectedoverridevoidDoWhatYouWant();{//doinA'sway}}classB:Foo{protectedoverridevoidDoWhatYouWant();{//doinB'sway}}面向?qū)ο蟮囊粋€(gè)重要特
8、點(diǎn)就是多態(tài),也就是對于同一個(gè)動作有不同的行為。Strategry通過委托的方式,將一個(gè)算法的不同實(shí)現(xiàn)委托給其它類;TemplateMethod通過繼承的方式,讓子類