抽象工厂模式

 抽象工厂设计模式

优点:

1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

https://blog.youkuaiyun.com/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> 

 

【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的研究资源,重点围绕电力系统中连锁故障的传播机制,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法提升系统安全性与鲁棒性。该模型通过Matlab代码实现,可用于模拟复杂电力系统在多重故障下的响应特性,支持对关键故障路径的识别与优化决策,适用于高水平科研复现与工程仿真分析。文中还列举了大量相关技术方向的配套资源,涵盖智能优化算法、电力系统管理、机器学习、路径规划等多个领域,并提供了网盘链接以便获取完整代码与资料。; 适合人群:具备电力系统、优化理论及Matlab编程基础的研究生、科研人员及从事能源系统安全分析的工程技术人员,尤其适合致力于高水平论文(如EI/SCI)复现与创新的研究者。; 使用场景及目标:①复现顶级期刊关于N-k故障与连锁传播的优化模型;②开展电力系统韧性评估、故障传播分析与多阶段防御策略设计;③结合YALMIP等工具进行双层优化建模与场景筛选算法开发;④支撑科研项目、学位论文或学术成果转化。; 阅读建议:建议读者按照文档提供的目录顺序系统学习,优先掌握双层优化与场景筛选的核心思想,结合网盘中的Matlab代码进行调试与实验,同时参考文中提及的智能算法与电力系统建模范例,深化对复杂电力系统建模与优化的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值