最近拿出了以前看過的一本《大話設計模式》重新翻閱,發現在工作中看的原始碼確實對自己的提公升挺大的,所以這一遍的看書效率比較搞。
在看了大半本之後發現設計模式中聚合這一方法用得比較多,如**,橋接,裝飾還有今天寫的策略模式都有用到(當然還有更多)。更驚奇的是自己對開閉這一原則有了更加深刻的認識,以至在寫這次的demo中很自然得就用上了抽象工廠模式。
首先,書中提到,策略模式就是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規則。在本例中,我以遊戲中的出裝(攻防裝)為例,順風(hp高於50)出攻擊裝,否則出防裝。
定義策略抽象類(此處為裝備方案)
class cequipment //裝備抽象類,在策略模式中為策略類
;
定義裝備的兩個派生類,由於繼承自抽象類,使得要增加新的出裝方案可以繼續繼承自抽象類,滿足「對拓展開放,對修改封閉」的理念。
class cplana :public cequipment
private:
};class cplanb :public cequipment
};
定義乙個玩家的具象類,此類內聚了乙個裝備方案的指標,使得可由此類呼叫方案的實施,而不必知曉方案具體的實現細節。
class cplayer //玩家類 維護乙個cequipment類
cequipment* getdataptr()
private:
cequipment* m_ptr;
};
下面是工廠方法設計模式,建立乙個工廠抽象類,並用子類去繼承,工廠類用於建立乙個具體方案(在客戶端判斷hp,然後決定具體new 哪乙個子類)
下面是乙個抽象工廠類和兩個派生類,由於定義了抽象類,使得要建立新的工廠的話不必對原有的工廠類進行修改,這也是工廠方法模式優於簡單工廠模式的地方。
class cfactory
;class cplanafac:public cfactory
};class cplanbfac :public cfactory
};
最後是客戶端的呼叫,美中不足的是需要讓客戶端實現判斷,來決定需要建立哪個工廠類,以實現生產出適合的plan
int main()
else
fac = new cplanbfac();
//父類指標指向子類物件,典型的多型
cequipment* equip=fac->createplan();
//利用cequipment* 初始化 cplayer的私有變數
cplayer* player = new cplayer(equip);
player->getdataptr()->plan();
簡單工廠模式 策略模式與工廠方法模式
用三種設計模式實現同一種功能 四則運算。三種設計模式相同的部分為四則運算類的設計,包括基類,加法運算類,減法運算類,乘法運算類和除法運算類,其 如下 class cclac class cclacadd public cclac class cclacsub public cclac class c...
工廠方法模式 工廠方法模式
工廠方法模式是簡單工廠模式的公升級版,簡單工廠模式不符合設計模式的原則 即 單一職責,開閉原則 優點 職責明確,擴充套件方便 缺點 需要建立多個工廠 實現步驟 1.將工廠通用方法抽取介面 例如 ifactory 2.將產品抽取介面 例如 icar 3.實現各種產品 例如 baomacar,benti...
工廠方法模式 工廠方法模式 二
工廠方法模式是對簡單工廠的進一步抽象和封裝,需要新的類物件時不需要對既有工廠類進行修改,而是增加新的工廠類。工程類可以使用模版進一步封裝,由編譯器來生成 從而減少 編寫工作量。工廠方法的 c 實現01part產品抽象基類class animal virtual void show 0 02part產...