论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
物联网
›
物联网
›
计划模式学习(二)工厂模式——抽象工厂模式+注册表 ...
计划模式学习(二)工厂模式——抽象工厂模式+注册表 ...
惊落一身雪
金牌会员
|
2024-7-19 20:29:26
|
显示全部楼层
|
阅读模式
楼主
主题
650
|
帖子
650
|
积分
1950
前言
在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论
使用简单工厂改进
对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除CameraFactory、BaslerCameraFactory和SickCameraFactory,取而代之的是SimpleFactory类。
类图如下:
代码如下:
//工厂类
class SimpleFactory
{
public:
BaslerCamera* CreateBaslerCamera()
{
if ("Linux" == os_name_)
{
return new LinuxBaslerCamera();
}
else if ("Windows" == os_name_)
{
return new WindowsBaslerCamera();
}
else
{
return nullptr;
}
}
SickCamera* CreateSickCamera()
{
if ("Linux" == os_name_)
{
return new LinuxSickCamera();
}
else if ("Windows" == os_name_)
{
return new WindowsSickCamera();
}
else
{
return nullptr;
}
}
public:
std::string os_name_ = "Linux";
};
//客户端
int main()
{
SimpleFactory* camera_factory = new SimpleFactory();
BaslerCamera* basler_camera = camera_factory->CreateBaslerCamera();
basler_camera->OpenCamera();
SickCamera* sick_camera = camera_factory->CreateSickCamera();
sick_camera->OpenCamera();
return 0;
}
复制代码
留意,上述方法固然改进了缺点①,但是缺点②仍存在。
使用注册表改进
对于缺点②,其本质是:增加新产物时,对工厂类带来的修改违反了开闭原则。对于这种情况,我们可以参考《计划模式学习(二)工厂模式——工厂方法模式+注册表》中提到的注册表,来去除switch或if这种分支判断,排除分支判断带来的耦合。
对于详细产物,我们可以这样将它注册:
class LinuxBaslerCamera : public BaslerCamera
{
public:
~LinuxBaslerCamera() override = default;
bool OpenCamera() override
{
return true;
}
};
ReflectRegister("LinuxBasler", LinuxBaslerCamera);
复制代码
然后工厂类的代码可以简化为:
class SimpleFactory
{
public:
BaslerCamera* CreateBaslerCamera()
{
std::string name = os_name_ + "Basler";
return Object::CreateObject<BaslerCamera>(name);
}
SickCamera* CreateSickCamera()
{
std::string name = os_name_ + "Sick";
return Object::CreateObject<SickCamera>(name);
}
public:
std::string os_name_ = "Linux";
};
复制代码
这样,在产物族增加时(好比增加一个HarmonyOS),我们只必要在它下面的产物类对应的文件中使用ReflectRegister注册,然后改变os_name_即可(固然os_name_也可以在运行时从设置文件中加载,这样更好)。
而对于现有的产物族内增加新产物(好比增加一个Huaray相机),工厂类中还是要增加一个CreateHuarayCamera函数。
参考文章
1.《谎话计划模式》
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
惊落一身雪
金牌会员
这个人很懒什么都没写!
楼主热帖
处理接口幂等性的两种常见方案 ...
图文结合带你搞懂InnoDB MVCC
数据湖选型指南|Hudi vs Iceberg 数据 ...
一个故事看懂CPU的SIMD技术
看完这个,还不会DVMA,请你吃瓜 ...
聊一聊 TLS/SSL
【.NET源码解读】深入剖析中间件的设计 ...
近万条中药各家经方验方秘方ACCESS\EXC ...
大数据-数据仓库-实时数仓架构分析 ...
腾讯叶聪:朋友圈爆款背后的计算机视觉 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表