|
最 近一段時間一直在學(xué)習(xí)設(shè)計模式,我有一個感受就是:接觸頭幾個設(shè)計模式時感覺似乎就那么一回事,好像沒有什么可學(xué)習(xí)的,因為理解起來很簡單,也很容易記 憶,在例子的帶動下似乎也有那么一點意思了,好像自己懂了。慢慢地,隨著學(xué)習(xí)的深入,接觸到了各種各樣的設(shè)計模式,前面那種輕松的勁兒就沒了,越學(xué)越迷 糊,感覺很多模式好像都是類似的,自己也分不清和前面學(xué)的模式的區(qū)別是什么了。再后來,經(jīng)過對這23種 基本的設(shè)計模式仔細(xì)研究,對比其實現(xiàn)類圖以及模式使用的目的,基本上清楚明白了各個設(shè)計模式之間的區(qū)別以及他們各自的使用范圍,為了使和我一樣在學(xué)習(xí)設(shè)計 模式的朋友少一些迷惑,我將我認(rèn)為的一些類似的、容易混淆的設(shè)計模式之間的區(qū)別總結(jié)出來共享給大家,希望能有所幫助,如有謬誤,歡迎指正。 在進(jìn)入正題之前,首先來了解一些基本的東西,有助于理解設(shè)計模式。 在面向?qū)ο缶幊讨?,理解對象、接口、類和繼承子類的概念對大多數(shù)人來說并不困難,問題關(guān)鍵在于如何運用它們寫出靈活的、可復(fù)用的軟件,而設(shè)計模式則可以告訴你如何去做。 面向?qū)ο笙到y(tǒng)中功能復(fù)用最常用的技術(shù)是類繼承和對象組合。類繼承屬于白盒復(fù)用,也就是說通過生成子類來達(dá)到復(fù)用的目的,父類的內(nèi)部細(xì)節(jié)對子類可見;對象組合屬于黑盒復(fù)用,對象的內(nèi)部細(xì)節(jié)是不可見的,對象組合要求被組合的對象具有良好定義的接口。針對以上的復(fù)用技術(shù),我們需要遵守兩條原則:第一,針對接口編程,而不是針對實現(xiàn)編程;第二,優(yōu)先使用對象組合,而不是類繼承。 針對接口編程有兩個好處:第一個好處是客戶不需要知道他們使用的對象的特定類型 ,只須對象有客戶所期望的接口;第二個好處是客戶無須知道他們使用的對象是用什么類來實現(xiàn)的,他們只須知道定義的接口或者抽象類。這將極大的減少子系統(tǒng)實現(xiàn)之間的相互依賴關(guān)系。 優(yōu) 先使用對象組合的優(yōu)點是:第一,由于對象的實現(xiàn)是基于接口編寫的,所以在實現(xiàn)上存在較少的依賴關(guān)系,可以在運行時刻動態(tài)的替換引用的對象實現(xiàn);第二,優(yōu)先 使用對象組合有助于保持每個類背封裝,并被集中在單個任務(wù)上,這樣類和類的繼承層次會保持在較少的規(guī)模,并且不太可能增長為不可控制的龐然大物;第三,使 用對象組合可以最大限度的不用創(chuàng)建新的構(gòu)件,而使用已有的構(gòu)件就可以組裝獲得所需要的功能。 設(shè)計模式就采用了大量的對象復(fù)合技術(shù)。設(shè)計模式按照目的劃分,可以分為創(chuàng)建型、結(jié)構(gòu)型、行為型三種,其中創(chuàng)建型模式與對象的創(chuàng)建有關(guān),結(jié)構(gòu)型模式處理類或?qū)ο蟮慕M合;行為型模式對類或?qū)ο笤鯓咏换ズ驮鯓臃峙渎氊?zé)進(jìn)行描述。 下面是各種模式按照目的劃分的分類 創(chuàng)建型模式:Factory Method、Abstract Factory、Builder、Prototype、 Singleton 構(gòu)造型模式:Adapter、Bridge、Composite、Decorator、Fa?ade、Flyweight、 行為型模式:Chain of Responsibility、Command、Iterator、Mediator、Mementor、Memento、Observer、State、Stategy、Visitor、Template Method、 創(chuàng)建型模式之間的區(qū)別 GoF23種設(shè)計模式中創(chuàng)建型模式有5種,分別是:Singleton單件模式、Abstract Factory抽象工廠模式、Builder生成器模式、Factory Method工廠方法模式、Prototype原形模式。由于創(chuàng)建型模式與對象創(chuàng)建有關(guān),所以這幾種模式一般不會與其他的結(jié)構(gòu)型模式和行為型模式混淆,這里將創(chuàng)建型模式單獨列出來集中講解。下面分別總結(jié)這幾種設(shè)計模式。
這里容易混淆的是Abstract Factory模式和Builder模式,Factory Method模式和Prototype模式也不好區(qū)分。Singleton模式?jīng)]什么太大的困難。下面就來分析一下前四種模式。 一、Abstract Factory模式和Builder模式: Abstract Factory是應(yīng)對一系列對象的創(chuàng)建的問題,對于創(chuàng)建一個汽車對象來說,Abstract Factory模式更關(guān)注一系列的對象的創(chuàng)建,如:Wheel、Engine、Body等等類型的創(chuàng)建, 這里的一系列可以這樣理解,寶馬汽車需要寶馬的Wheel,寶馬的Engine,寶馬的Body等等一系列配套的東西,而保時捷汽車則需要保時捷的Wheel,保時捷的Engine等等和保時捷配套的東西。大家注意這換句話說關(guān)注點在這一系列對象上,同時它關(guān)注創(chuàng)建對象得到的結(jié)果。 Builder則是將復(fù)雜對象的構(gòu)建過程與它的表示相分離,使得不同的表示可以使用同樣的構(gòu)建過程。這里我們要注意紅色的部分,即構(gòu)建過程與表示相分離,我們可以如此理解,也就是說將結(jié)果與對象創(chuàng)建過程進(jìn)行分離,這里關(guān)注點是過程。Builder模式注重的對象生產(chǎn)的過程,也就是如何一步一步將需要的對象構(gòu)建起來的,同樣對于一個汽車對象來舉例,我們需要首先創(chuàng)建Wheel,再創(chuàng)建Engine,再創(chuàng)建Body,然后將他們進(jìn)行組裝,得到想要的汽車對象,可以看到,Builder模式將構(gòu)建的組裝的過程進(jìn)行了隱藏和封裝。而Abstract Factory則只是一系列對象的工廠,組裝可能還是需要客戶自己來完成。 二、Factory Method模式和Prototype模式: 這兩個模式區(qū)別比較簡單,可以這樣理解,Factory Method模式是重新創(chuàng)建一個對象;Prototype模式是利用現(xiàn)有的對象進(jìn)行克隆,當(dāng)兩個對象或多個對象雷同的時候,可以考慮用一個已創(chuàng)建的對象去克隆出其余的對象。 Abstract Factory一般是利用Factory Method模式來完成一系列對象中的單個對象的創(chuàng)建。 |
|
|
來自: rookie > 《技術(shù)帖》