C 設計模式初探(二)

2021-10-22 12:17:05 字數 3328 閱讀 7709

一、簡單工廠模式

考慮這樣乙個場景,王者榮耀的英雄池裡面有很多英雄類,當選擇乙個英雄的時候,就相當於例項化了乙個類物件,比如new 亞瑟new 妲己……傳統的方法是在頂層直接呼叫new+類名來構造乙個物件,但是如果類的構造過程十分複雜,而頂層邏輯並不關心具體的構造過程,就可以使用工廠模式。建立乙個工廠類,其有乙個create函式,根據傳入的引數不同,返回不同的物件。

#include

using

namespace std;

//抽象英雄類

class

abstracthero;}

;//百里守約類

class

bailishouyuehero

:public abstracthero;}

;//妲己類

class

dajihero

:public abstracthero;}

;//李白類

class

libaihero

:public abstracthero;}

;//工廠類

class

factory

else

if(name ==

"妲己"

)else

if(name ==

"李白"

)else

return

null;}

;};int

main()

可見,工廠模式有以下優點:

1、邏輯層與底層解耦

2、客戶端不必關心複雜的底層構造過程

3、適用於物件比較少的情況

缺點:

1、不符合開閉原則,增加乙個英雄就要修改工廠類的**

2、不符合單一職責原則,這個工廠類發生問題時候,會影響很多地方

二、工廠方法模式

簡單工廠模式有弊端,即他不符合開閉原則和單一職責原則

那麼只要設計乙個抽象工廠類,再用百里守約工廠類 ,李白工廠類,繼承於抽象工廠類,這樣就實現了工廠方法模式,也符合開閉原則和單一職責原則。

但毫無疑問,這種方法大大增加了**量,增加抽象性和理解難度,這也是我最困惑的地方,這不累嗎?

#include

using

namespace std;

//抽象英雄類

class

abstracthero;}

;//百里守約類

class

bailishouyuehero

:public abstracthero;}

;//妲己類

class

dajihero

:public abstracthero;}

;//李白類

class

libaihero

:public abstracthero;}

;//抽象工廠類

class

abstractfactory

;//百里守約工廠類

class

bailishouyuefactory

:public abstractfactory;}

;//妲己工廠類

class

dajifactory

:public abstractfactory;}

;//李白工廠類

class

libaifactory

:public abstractfactory;}

;int

main()

三、抽象工廠模式

考慮如下情景:

在前文中,我們已經建立了各種建立英雄的工廠,但一局遊戲有十個人,玩家a選擇的英雄,跟玩家b選擇的英雄是不一樣的,即使他們全部選擇妲己,這幾個妲己也是妲己a,妲己b……那怎麼區分呢?

抽象工廠模式:針對產品族,而不是產品等級。

產品族:同乙個**,不同功能。如玩家a建立了妲己a,又建立了百里守約a。

產品等級:同乙個功能,不同**。如玩家a,玩家b建立了妲己a,妲己b。

抽象工廠,即把工廠作為抽象類,派生出玩家a工廠,玩家b工廠,這時如果新加入了玩家c,只需要再派生乙個玩家c工廠即可,對於產品族的擴充套件,是符合開閉原則的;

但是對於產品等級則不符合開閉原則。假如要新增乙個英雄露娜,就需要修改所有的工廠**。

抽象工廠**太多,就不放了,講一講思路。

1、抽象出乙個抽象百里守約、抽象李白、抽象妲己類;

2、這三個類派生出玩家a的百里守約,玩家b的百里守約,玩家a的李白……等等

3、抽象出乙個抽象工廠類;

4、派生出玩家a的工廠,玩家b的工廠。

四、單例模式

考慮如下情景:

在系統中,某些類只允許存在乙個例項,比如任務管理器的視窗,只能有乙個,這個情況就是單例模式。步驟如下:

1、建構函式私有化

2、宣告乙個靜態私有成員變數,型別為該類

3、類外初始化該私有變數

4、提供乙個靜態的對外介面

#include

using

namespace std;

class

task

public

:static task *

getinstance()

return mtask;

}private

:static task *mtask;};

task* task::mtask =

null

;int

main()

上面建立的是乙個懶漢式單例,因為這個單例是在main函式執行之後才呼叫建構函式的,看起來比較懶,所以叫懶漢式,下面寫乙個餓漢式

class

task_hungry

static task_hungry* mtask;

public

:static task_hungry*

getinstance()

};task_hungry* task_hungry::mtask =

new task_hungry;

餓漢式的建構函式會在main之前就呼叫,看起來很餓,所以叫餓漢式

單例銷毀問題:單例的一般不提供銷毀介面。

設計模式初探(二) Facade模式

在以前不懂設計模式的歲月中,我總是對著各種語言框架中的那個facades模組不知所措。當對設計模式有了一定的了解以後,提公升的不僅僅是自己寫 時的所思所想,對於框架的理解程度,和學習框架的速度也會上乙個台階。facade模式主要是為了解決開發中各個子系統之間的緊密耦合的問題。這是乙個來自 設計模式的...

設計模式初探

花了大概11個番茄,把 大話設計模式 這本書從頭到尾翻了一遍。畫了一張導圖。整本書介紹了物件導向和設計 模式,但顯然這兩部分是不可分割的。每個設計模式都是物件導向思想的靈活運用,無不體現著封裝,繼承,多型,最 終歸結為抽象二字。正如 精彩的 是如何想出來的,要比看到精彩的 更加令人期待 每個設計模式...

設計模式 初探

一 是什麼 模式是解決一類問題的方法。設計模式本身是不存在的,是一種隱性知識,它是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。二 為什麼要學 設計模式是為了解決問題而發明的有效的方法,23種模式都是前輩們經過多年的摸索總結出來的,其有效性不容置疑。每乙個設計模式都是針對乙個或者一類...