C++实现一个自动注册类工厂(抽象工厂)
1 #include <string> 2 #include <map> 3 #include <list> 4 #include <stdio.h> 5 6 #define USERS_PARAM(X) X; 7 8 class ZBSBase 9 { 10 public: 11 ZBSBase(){} 12 virtual bool InitParam(const std::string& strParam) = 0; 13 virtual void Excute() = 0; 14 virtual void End() = 0; 15 }; 16 17 class ZBSMessage : public ZBSBase 18 { 19 public: 20 ZBSMessage():m_bInit(false){} 21 22 virtual bool InitParam(const std::string& strParam) 23 { 24 m_bInit = true; 25 USERS_PARAM(strParam); 26 return true; 27 } 28 29 virtual void Disp() 30 { 31 printf("ZBSMessage::Disp!\n"); 32 } 33 34 virtual void End() 35 { 36 printf("ZBSMessage::End!\n"); 37 } 38 39 virtual void Excute() 40 { 41 if (!m_bInit) return; 42 printf("ZBSMessage::Excute!\n"); 43 Disp(); 44 End(); 45 } 46 47 protected: 48 bool m_bInit; 49 }; 50 51 class ZBSEncodeMessage : public ZBSMessage 52 { 53 public: 54 ZBSEncodeMessage(){} 55 56 virtual void Disp() 57 { 58 printf("ZBSEncodeMessage::Disp\n"); 59 } 60 }; 61 62 class ZBSJsonMessage : public ZBSMessage 63 { 64 public: 65 ZBSJsonMessage(){} 66 67 virtual void Disp() 68 { 69 printf("ZBSJsonMessage::Disp\n"); 70 } 71 }; 72 73 class ZBSXMLMessage : public ZBSMessage 74 { 75 public: 76 ZBSXMLMessage(){} 77 78 virtual void Disp() 79 { 80 printf("ZBSXMLMessage::Disp\n"); 81 } 82 }; 83 84 class ZBSCreatorBase 85 { 86 public: 87 ZBSCreatorBase(){} 88 virtual ZBSMessage* Create() = 0; 89 }; 90 91 template<class T> 92 class ZBSCreator :public ZBSCreatorBase 93 { 94 public: 95 ZBSCreator(const std::string& strkey = "") :m_strKey(strkey){} 96 97 ZBSMessage* Create() 98 { 99 return new T; 100 } 101 private: 102 std::string m_strKey; 103 }; 104 105 class ZBSFactoryMgr 106 { 107 ZBSFactoryMgr(){} 108 109 public: 110 static ZBSFactoryMgr& Instance() 111 { 112 static ZBSFactoryMgr s_Instance; 113 114 return s_Instance; 115 } 116 117 void AddZBSCreator(const std::string& strClassName, ZBSCreatorBase* pZBSCreator) 118 { 119 if (m_mapZBSCreator.find(strClassName) == m_mapZBSCreator.end()) 120 { 121 m_mapZBSCreator.insert(make_pair(strClassName, pZBSCreator)); 122 } 123 } 124 125 ZBSMessage* CreatorZBSInstace(const std::string& strKey) 126 { 127 ZBSMessage* pZBSObj = NULL; 128 std::map<std::string, ZBSCreatorBase*>::iterator it; 129 130 it = m_mapZBSCreator.find(strKey); 131 if (it != m_mapZBSCreator.end()) 132 { 133 pZBSObj = it->second->Create(); 134 } 135 136 return pZBSObj; 137 } 138 139 int GetMapSize() 140 { 141 return m_mapZBSCreator.size(); 142 } 143 144 private: 145 std::map<std::string, ZBSCreatorBase*> m_mapZBSCreator; 146 }; 147 148 #define REGISTER_ZBSFACTORY(ClassName)\ 149 ZBSFactoryMgr::Instance().AddZBSCreator(#ClassName, new ZBSCreator<ClassName>()); 150 151 extern "C" ZBSMessage* CreateZBSMessage(const std::string& strKey) 152 { 153 return ZBSFactoryMgr::Instance().CreatorZBSInstace(strKey); 154 } 155 156 int main() 157 { 158 REGISTER_ZBSFACTORY(ZBSXMLMessage); 159 REGISTER_ZBSFACTORY(ZBSJsonMessage); 160 REGISTER_ZBSFACTORY(ZBSEncodeMessage); 161 162 ZBSMessage *pm1; 163 ZBSMessage *pm2; 164 ZBSMessage *pm3; 165 166 std::list<ZBSMessage*> ls; 167 std::list<ZBSMessage*>::iterator it; 168 169 pm1 = CreateZBSMessage("ZBSXMLMessage"); 170 pm2 = CreateZBSMessage("ZBSJsonMessage"); 171 pm3 = CreateZBSMessage("ZBSEncodeMessage"); 172 173 ls.push_back(pm1); 174 ls.push_back(pm2); 175 ls.push_back(pm3); 176 177 int nSize = ls.size(); 178 it = ls.begin(); 179 for (it; it != ls.end(); it++) 180 { 181 (*it)->InitParam(""); 182 (*it)->Excute(); 183 } 184 return 0; 185 }
随笔一写、就没分开文件了!