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 }

随笔一写、就没分开文件了!

转载于:https://www.cnblogs.com/zbs337650377/p/7239649.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值