抽象工厂设计模式
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
https://blog.csdn.net/tayanxunhua/article/details/8245900
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>