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