設計模式區別(一)

2022-08-18 03:39:10 字數 3813 閱讀 8824

最近一段時間一直在學習設計模式,我有乙個感受就是:接觸頭幾個設計模式時感覺似乎就那麼一回事,好像沒有什麼可學習的,因為理解起來很簡單,也很容易記憶,在例子的帶動下似乎也有那麼一點意思了,好像自己懂了。慢慢地,隨著學習的深入,接觸到了各種各樣的設計模式,前面那種輕鬆的勁兒就沒了,越學越迷糊,感覺很多模式好像都是類似的,自己也分不清和前面學的模式的區別是什麼了。再後來,經過對這

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

模式更關注一系列的物件的建立,如:

wheel

、engine

、body

等等型別的建立

, 這裡的一系列可以這樣理解,寶馬汽車需要寶馬的

wheel

,寶馬的

engine

,寶馬的

body

等等一系列配套的東西,而保時捷汽車則需要保時捷的

wheel

,保時捷的

engine

等等和保時捷配套的東西。大家注意這換句話說關注點在這一系列物件上,同時它關注建立物件得到的結果。

builder

則是將複雜物件的構建過程與它的表示相分離,使得不同的表示可以使用同樣的構建過程。這裡我們要注意紅色的部分,即構建過程與表示相分離,我們可以如此理解,也就是說將結果與物件建立過程進行分離,這裡關注點是過程。

builder

模式注重的物件生產的過程,也就是如何一步一步將需要的物件構建起來的,同樣對於乙個汽車物件來舉例,我們需要首先建立

wheel

,再建立

engine,

再建立body

,然後將他們進行組裝,得到想要的汽車物件,可以看到,

builder

模式將構建的組裝的過程進行了隱藏和封裝。而

abstract factory

則只是一系列物件的工廠,組裝可能還是需要客戶自己來完成。

二、factory method

模式和prototype

模式:這兩個模式區別比較簡單,可以這樣理解,

factory method

模式是重新建立乙個物件;

prototype

模式是利用現有的物件進行轉殖,當兩個物件或多個物件雷同的時候,可以考慮用乙個已建立的物件去轉殖出其餘的物件。

abstract factory

一般是利用

factory method

模式來完成一系列物件中的單個物件的建立。

未完待續

設計模式的區別

簡單 模式中,類知道被 類的行為,因為 類與被 類實現的是同乙個介面,因此 類與被 類的結構是相同的 而策略模式中,策略容器並不知道內部策略的詳細資訊,因為容器並沒有實現與內部策略相同的介面,即容器與內部策略只是簡單的組合關係,容器只是將內部策略的行為抽取出來,進行了統一的實現。策略模式僅僅封裝演算...

設計模式 工廠設計模式 一

工廠設計模式 就是當我們需要批量建立多種型別的物件時 需要用到,主要分為三種形式 1 靜態工廠,也叫簡單工廠模式,就是你傳乙個型別我建立對應的型別,spring中主要用到的就是這種模式 不多說,直接上 通用的產品介面,product 這個看需求,也可以定義為抽象類,根據你的物件之間的關係來定的 pa...

設計模式(一) 設計模式概述

模擬建築學 質量可以客觀評價 我們可以得到設計模式背後的觀點 軟體系統的質量可以客觀度量。模式的描述 模式的名稱 模式的目的,即要解決的問題 實現方法 為了實現該模式我們必須考慮的限制和約數因素 gof 四人幫 的工作是將已有的模式識別出來。而非創造 模式的關鍵特徵 專案描述 名稱每個模式都有唯一用...