設計模式區別(一)

最近一段時間一直在學習設計模式,我有一個感受就是:接觸頭幾個設計模式時感覺似乎就那麼一回事,好像沒有什麼可學習的,因爲理解起來很簡單,也很容易記憶,在例子的帶動下似乎也有那麼一點意思了,好像自己懂了。慢慢地,隨着學習的深入,接觸到了各種各樣的設計模式,前面那種輕鬆的勁兒就沒了,越學越迷糊,感覺很多模式好像都是類似的,自己也分不清和前面學的模式的區別是什麼了。再後來,經過對這23種基本的設計模式仔細研究,對比其實現類圖以及模式使用的目的,基本上清楚明白了各個設計模式之間的區別以及他們各自的使用範圍,爲了使和我一樣在學習設計模式的朋友少一些迷惑,我將我認爲的一些類似的、容易混淆的設計模式之間的區別總結出來共享給大家,希望能有所幫助,如有謬誤,歡迎指正。

在進入正題之前,首先來了解一些基本的東西,有助於理解設計模式。

在面向對象編程中,理解對象、接口、類和繼承子類的概念對大多數人來說並不困難,問題關鍵在於如何運用它們寫出靈活的、可複用的軟件,而設計模式則可以告訴你如何去做。

面向對象系統中功能複用最常用的技術是類繼承對象組合。類繼承屬於白盒複用,也就是說通過生成子類來達到複用的目的,父類的內部細節對子類可見;對象組合屬於黑盒複用,對象的內部細節是不可見的,對象組合要求被組合的對象具有良好定義的接口。針對以上的複用技術,我們需要遵守兩條原則:第一,針對接口編程,而不是針對實現編程;第二,優先使用對象組合,而不是類繼承。

針對接口編程有兩個好處:第一個好處是客戶不需要知道他們使用的對象的特定類型 ,只須對象有客戶所期望的接口;第二個好處是客戶無須知道他們使用的對象是用什麼類來實現的,他們只須知道定義的接口或者抽象類。這將極大的減少子系統實現之間的相互依賴關係。

優先使用對象組合的優點是:第一,由於對象的實現是基於接口編寫的,所以在實現上存在較少的依賴關係,可以在運行時刻動態的替換引用的對象實現;第二,優先使用對象組合有助於保持每個類背封裝,並被集中在單個任務上,這樣類和類的繼承層次會保持在較少的規模,並且不太可能增長爲不可控制的龐然大物;第三,使用對象組合可以最大限度的不用創建新的構件,而使用已有的構件就可以組裝獲得所需要的功能。

設計模式就採用了大量的對象複合技術。設計模式按照目的劃分,可以分爲創建型、結構型、行爲型三種,其中創建型模式與對象的創建有關,結構型模式處理類或對象的組合;行爲型模式對類或對象怎樣交互和怎樣分配職責進行描述。

下面是各種模式按照目的劃分的分類

創建型模式:Factory Method、Abstract Factory、Builder、Prototype、  Singleton

構造型模式:Adapter、Bridge、Composite、Decorator、Façade、Flyweight、
Proxy

行爲型模式:Chain of Responsibility、Command、Iterator、Mediator、Mementor、Memento、Observer、State、Stategy、Visitor、Template Method、
Interpreter

   

創建型模式之間的區別

GoF23種設計模式中創建型模式有5種,分別是:Singleton單件模式、Abstract Factory抽象工廠模式、Builder生成器模式、Factory Method工廠方法模式、Prototype原形模式。由於創建型模式與對象創建有關,所以這幾種模式一般不會與其他的結構型模式和行爲型模式混淆,這裏將創建型模式單獨列出來集中講解。下面分別總結這幾種設計模式。

 

設計模式

GoF的描述

優點或缺點

Singleton單件模式

保證一個類僅有一個實例,並提供一個該實例全局的訪問點

可以保證唯一實例;允許在需要時擁有可變數目的實例

Abstract Factory抽象工廠模式

提供一個接口,讓該接口負責創建一系列相關或者相互依賴的對象,無需指定他們的具體類

分離了具體的類;可以生產一系列的相關對象,有利於產品的一致性;缺點是難以支持新種類的產品

Builder生成器模式

將一個複雜對象的構建與其表示向分離,使得同樣的構建過程可以創建不同的表示

可以使你改變一個產品的內部表示;將構造過程和表示分開;可以對構造過程進行更精細的控制

Factory Method工廠方法模式

定義一個用於創建對象的接口,讓子類決定實例化那個類。FactoryMethod使得一個類的實例化延遲到子類

爲子類提供了掛鉤以提供對象的擴展版本,也就是說子類可以覆蓋工廠方法改變創造的產品實例

Prototype原形模式

使用原型實例指定創建對象的種類,然後通過拷貝這些原型來創建新的對象

改變值獲得新的對象;可以在運行時刻指定要實例化的類,例如某個對象設置了若干屬性之後,我們需要N這種設置了相同屬性的對象,那麼可以通過該模式,在動態運行時直接拷貝來生成

      

這裏容易混淆的是Abstract Factory模式和Builder模式,Factory Method模式和Prototype模式也不好區分。Singleton模式沒什麼太大的困難。下面就來分析一下前四種模式。

一、Abstract Factory模式和Builder模式:

Abstract Factory是應對一系列對象的創建的問題,對於創建一個汽車對象來說,Abstract Factory模式更關注一系列的對象的創建,如:WheelEngineBody等等類型的創建, 這裏的一系列可以這樣理解,寶馬汽車需要寶馬的Wheel,寶馬的Engine,寶馬的Body等等一系列配套的東西,而保時捷汽車則需要保時捷的Wheel,保時捷的Engine等等和保時捷配套的東西。大家注意這換句話說關注點在這一系列對象上,同時它關注創建對象得到的結果

Builder則是將複雜對象的構建過程與它的表示相分離,使得不同的表示可以使用同樣的構建過程。這裏我們要注意紅色的部分,即構建過程與表示相分離,我們可以如此理解,也就是說將結果與對象創建過程進行分離,這裏關注點是過程。Builder模式注重的對象生產的過程,也就是如何一步一步將需要的對象構建起來的,同樣對於一個汽車對象來舉例,我們需要首先創建Wheel,再創建Engine,再創建Body,然後將他們進行組裝,得到想要的汽車對象,可以看到,Builder模式將構建的組裝的過程進行了隱藏和封裝。而Abstract Factory則只是一系列對象的工廠,組裝可能還是需要客戶自己來完成。

二、Factory Method模式和Prototype模式:

這兩個模式區別比較簡單,可以這樣理解,Factory Method模式是重新創建一個對象;Prototype模式是利用現有的對象進行克隆,當兩個對象或多個對象雷同的時候,可以考慮用一個已創建的對象去克隆出其餘的對象。

Abstract Factory一般是利用Factory Method模式來完成一系列對象中的單個對象的創建。

 

未完待續

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章