設計模式 建立型模式 知識點 小結

2021-07-05 03:07:23 字數 4165 閱讀 9371

【摘要】

按照目的來分,設計模式可以分為建立型模式、結構型模式和行為型模式。建立型模式包括工廠方法模式(factory method pattern)、抽象工廠模式(abstract factory pattern) 、建造者模式(builder pattern)、原型模式(prototype pattern)單例模式(singleton pattern)。本文將詳述建立型各個模式的定義、實現案例並分析比較各模型之間的共性和區別。

設計模式分類 說明

建立型模式

工廠方法模式

(factory method pattern)

定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類中。

抽象工廠模式

(abstract factory pattern)

提供乙個建立一系列相關或者相互依賴的介面,而無需指定它們具體的類。

建造者模式

(builder pattern)

將乙個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。

原型模式

(prototype pattern)

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

單例模式

(singleton pattern)

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

【正文】

factory模式不單單提供物件的介面,更重要的是延遲了子類例項化,將物件的建立放到了子類之中。
示例

基本類

父類(產品介面) 人

派生類(產品)

黃種人黑種人

白種人

工廠類父類(工廠介面)

返回建立  人 的類方法

派生類(工廠)

返回建立 黃 的方法

返回建立 黑 的方法

返回建立 白 的方法

主函式.cpp

main.cpp

自定義函式【3個】

建立各種 人 的類的例項化

主函式呼叫自定義函式

小結:

工廠模式的特點就是把物件的「建構函式」封裝起來,建立「建構函式」類和「建構函式」派生類系列。

定義

abstract factory模式更注重介面的組合,即,將一組物件的建立封裝到乙個用於建立物件的類中,維護這樣乙個建立介面要比建立幾個簡單物件簡單得多。提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。對於工廠方法來說,抽象工廠可實現一系列產品的生產,抽象工廠更注重產品的組合。

示例

基本類

父類(產品介面) 人

派生類1(抽象產品)

黃種人黑種人

白種人派生類2(具體產品)

黃種男人

黃種女人

黑種男人

黑種女人

白種男人

白種女人

抽象工廠類

父類(抽象工廠)

返回建立 黃+黑+白 人 的類方法

派生類(工廠)

返回建立 男*3 的方法

返回建立 女*3 的方法

主函式.cpp

main.cpp

自定義函式

建立各種 人 的類的例項化

主函式呼叫自定義函式

小結:抽象工廠模式的特點就是把多個同輩物件的「建構函式」封裝起來,每乙個「建構函式」返回乙個類。雖然,抽象工廠模型與工廠模型相類似,但是,抽象工廠模式針對的類結構較工廠模式更為複雜,即,層次更多。此外,抽象工廠針對的是具體產品類的父類的建立

,這裡不再顧及產品介面類(祖輩)。

singleton 模式在系統中只允許產生這個類的乙個例項。singleton 模式解決問題十分常見,即我們怎樣去建立乙個唯一的變數(乙個類只能產生乙個物件)。在基於物件的設計中我們可以通過建立乙個全域性變數(物件)來實現,在物件導向和面向過程結合的設計正規化(如 c++中)中,我們也還是可以通過乙個全域性變數實現這一點。但是,當我們遇到了純粹的物件導向正規化中,這一點可能就只能是通過 singleton 模式來實現了。 singleton 模式是設計模式中最為簡單、最為常見、最容易實現,在 singleton 模式的結構圖中可以看到,我們通過維護乙個 static 的成員變數來記錄這個唯一的物件例項。通過提供乙個staitc 的介面instance 來獲得這個唯一的例項。 

注意:執行緒安全,採用互斥體的方式實現。

小結:抽單例模式定義乙個靜態指標,和乙個靜態函式,私有化建構函式、析構函式、建構函式複製、過載賦值語句

定義

builder模式,將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。實現建立不同表示的方法就是給建立的過程傳入建立的引數。builder 模式的關鍵是其中的 director 物件並不直接返回物件,而是通過一步步(build parta -> build partb -> build partc)來一步步進行物件的建立。當然這裡director可以提供乙個預設的返回物件的介面(即返回通用的複雜物件的建立,即不指定或者特定唯一指定buildpart中的引數)。 建造者模式和抽象工廠非常類似。建造者更重視產品建造時的邏輯順序,而抽象工廠更重視生產出不同型號的產品,抽象工廠不關心順序。

示例

基本類

父類 (產品模型)

汽車模型(需要呼叫輸出不同字串的各個函式,字串輸出函式的呼叫順序因呼叫run函式輸入引數的不同而變化)

派生類(產品)

寶馬模型(自定義字串輸出函式)

賓士模型(自定義字串輸出函式)

建造者類定義

父類(建造者介面介面)

返回建立 汽車模型 的類方法 和 引數設定函式

派生類(建造者)

設定寶馬引數 返回寶馬模型

設定賓士引數 返回賓士模型

director 類(通過dynamic_cast轉換類物件指標)

成員變數

不同引數

成員函式

返回不同引數設定的模型

主函式.cpp

main.cpp

自定義run函式

設計字串 例項化汽車模型(一次只能實現乙個模型單例)

自定義build函式

通過build類實現汽車例項化(一次能實現乙個模型類別)

自定義director函式

通過director類實現汽車例項化(一次能實現全部類別)

主函式呼叫自定義函式

小結:建造者模式關注建造的順序,這個類需要哪些引數,這些引數怎樣一步一步構建得到類實體。步進引數作為成員變數,祖類介面作為 director 返回資料型別,兩者構成了建造者模式的核心。

定義

prototype 模式提供了自我複製的功能,就是說新物件的建立可以通過已有物件進行建立。在 c++中拷貝建構函式(copy constructor)中淺層拷貝和深層拷貝與本例有相似之處。 prototype 模式提供了乙個通過已存在物件進行新物件建立的介面(clone)。這個模式的簡單程度是僅次於單例模式和迭代器模式,非常簡單,但是要使用好這個模式還有很多注意事項。

示例

基本類定義

廣告模板

廣告主題字串+廣告主體字串 郵件

(原型模式)

成員變數 :發件人+收件人+主體+主題

成員函式 :廣告轉殖函式

主函式.cpp

自定義函式(發郵件)

模板物件 -> 郵件物件 -> 郵件引數設定

主函式迴圈傳送郵件

小結:原型模式主要在於類物件拷貝函式的實現。實質就是返回類物件「模板」。

設計模式 建立型模式 原型模式

1 原型模式 prototype模式 是指 用原型例項指定建立物件的種類,並且通過拷貝這些原型,建立新的物件 2 原型模式是一種建立型設計模式,允許乙個物件再建立另外乙個可定製的物件,無需知道如何建立的細節 3 工作原理是 通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型...

設計模式 建立型模式

建立型模式 與物件的建立有關。1 簡單工廠模式 靜態工廠 簡單工廠關聯具體類,通過簡單工廠來建立具體的類。封裝變化到簡單工廠裡面去。工廠類 具體類 2 工廠模式 抽象工廠 具體工廠 具體類 要是新增新的類,只需要擴充套件就可以了。他們對外的行為是一致的。3 抽象工廠 抽象工廠 具體工廠 具體類 具體...

設計模式 建立型模式

建立型模式 工廠方法 核心 客戶端呼叫具體的工廠,讓工廠去決定例項化哪個具體的類。核心 為工廠類建立對應的具體的類,表現為和對應的具體類的依賴關係。抽象工廠類 inte ce productfactory 具體a工廠 class concreteproductfactorya productfact...