简单工厂组合策略模式_反射
2017-05-16 15:18
411 查看
#include <iostream> #include <map> using namespace std; typedef void* (*CreateClass)(int,int); #define DECLARE_CLASS(className)\ static CKDynamicClass *className##dc; #define IMPLEMENT_CLASS(c,className)\ CKDynamicClass* className::className##dc=\ new CKDynamicClass(c,className::CreateInstance); class CClassFactory { private: map<char,CreateClass> m_mapMethod; public: void* GetClassByType(char cType,int nFirst,int nSecond) { map<char,CreateClass>::const_iterator iter; iter=m_mapMethod.find(cType); if(iter!=m_mapMethod.end()) return iter->second(nFirst,nSecond); else return NULL; } void RegisterMethod(char cType,CreateClass method) { m_mapMethod.insert(pair<char,CreateClass>(cType,method)); } static CClassFactory& GetInstance() { static CClassFactory classFactory; return classFactory; } }; class CKDynamicClass { public: CKDynamicClass(char cType,CreateClass method) { CClassFactory::GetInstance().RegisterMethod(cType,method); } }; class COperation { protected: int m_nFirst; int m_nSecond; public: COperation(int nFirst,int nSecond) :m_nFirst(nFirst),m_nSecond(nSecond) {} virtual double GetResult()=0; }; class CContext { private: COperation *m_classOper; public: CContext(char cType,int nFirst,int nSecond) { m_classOper=(COperation*)CClassFactory::GetInstance().GetClassByType(cType,nFirst,nSecond); } double GetResult() { double dResult=0.0; if(m_classOper!=NULL) dResult=m_classOper->GetResult(); return dResult; } }; class CAddOperation:public COperation { private: DECLARE_CLASS(CAddOperation) public: CAddOperation(int nFirst,int nSecond) :COperation(nFirst,nSecond) {} static void* CreateInstance(int nFirst,int nSecond) { return new CAddOperation(nFirst,nSecond); } virtual double GetResult() { return m_nFirst+m_nSecond; } }; IMPLEMENT_CLASS('+',CAddOperation) class CSubOperation:public COperation { private: DECLARE_CLASS(CSubOperation) public: CSubOperation(int nFirst,int nSecond) :COperation(nFirst,nSecond) {} static void* CreateInstance(int nFirst,int nSecond) { return new CSubOperation(nFirst,nSecond); } virtual double GetResult() { return m_nFirst-m_nSecond; } }; IMPLEMENT_CLASS('-',CSubOperation) /********扩展***************/ class CMulOperation:public COperation { private: DECLARE_CLASS(CMulOperation) public: CMulOperation(int nFirst,int nSecond) :COperation(nFirst,nSecond) {} static void* CreateInstance(int nFirst,int nSecond) { return new CMulOperation(nFirst,nSecond); } virtual double GetResult() { return m_nFirst*m_nSecond; } }; IMPLEMENT_CLASS('*',CMulOperation) /************************************/ int main(void) { char c; cin>>c; CContext *pContext=new CContext(c,4,3); cout<<pContext->GetResult()<<endl; system("pause"); return 0; }
相关文章推荐
- 策略模式和简单工厂及反射的联合应用(待续)
- SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
- 策略模式结合简单工厂模式
- 简单工厂模式,抽象工厂模式,反射工厂模式的代码总结
- 策略模式与简单工厂模式
- 简单工厂模式和策略模式的区别
- 策略模式 + 简单工厂模式
- 策略模式结合简单工厂模式
- 大话设计模式-策略模式与简单工厂模式
- 策略模式+简单工厂=强强联合
- 设计模式学习笔记一 简单工厂策略模式实现销售策略的变更(一)
- 设计模式——简单工厂+策略模式
- 设计模式之简单工厂模式加反射
- 简单工厂与策略模式的区别
- 设计模式心得笔记--简单工厂和策略模式
- vb.net 中通过反射实现简单工厂模式
- Design Pattern【2.2】反射&简单工厂模式
- 大话设计模式-----简单工厂模式与策略模式
- 反射 内省 JaveBean 与 简单工厂设计模式
- 设计模式解读 之策略模式(参照策略模式与简单工厂模式的对比)