一、簡單工廠模式
考慮這樣乙個場景,王者榮耀的英雄池裡面有很多英雄類,當選擇乙個英雄的時候,就相當於例項化了乙個類物件,比如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種模式都是前輩們經過多年的摸索總結出來的,其有效性不容置疑。每乙個設計模式都是針對乙個或者一類...