设计模式学习(二)工厂模式——抽象工厂模式+注册表

news/2024/11/18 15:31:50/文章来源:https://www.cnblogs.com/paw5zx/p/18292689

目录
  • 前言
  • 使用简单工厂改进
  • 使用注册表改进
  • 参考文章

前言

在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论

使用简单工厂改进

对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除CameraFactoryBaslerCameraFactorySickCameraFactory,取而代之的是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;
}

注意,上述方法虽然改进了缺点①,但是缺点②仍存在。

使用注册表改进

对于缺点②,其本质是:增加新产品时,对工厂类带来的修改违反了开闭原则。对于这种情况,我们可以参考《设计模式学习(二)工厂模式——工厂方法模式+注册表》中提到的注册表,来去除switchif这种分支判断,解除分支判断带来的耦合。

对于具体产品,我们可以这样将它注册:

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.《大话设计模式》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741317.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器怎么连接?服务器远程连接图文教程

服务器操作系统可以实现对计算机硬件与软件的直接控制和管理协调,任何计算机的运行离不开操作系统,服务器也一样,服务器操作系统主要分为四大流派:Windows Server、Netware、Unix和Linux 今天飞飞就给你们分享下常用的Windows、Linux、Unix三种系统的远程连接图文操作方法服…

Candy Party (Hard Version)

这个就看官方题解就好了,写的很清楚 考试的时候把easy version给做出来了,但是对于hard version确实没有想到可以转换成位运算 所以以后看到\(2^x\),不妨想一下是不是位运算,这里将最后的式子一列就知道是位运算了

【Azure App Service】访问App Service应用报错 SSL: WRONG_VERSION_NUMBER

REST API: write EPROTO 8936192:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:..\..\third_party\boringssl\src\ssl\tls_record.cc:231. Python: urllib3.exceptions.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1000)问题…

题解 - 修剪草坪

单调队列优化 dp题目(in 洛谷) 或 题目(in hszxoj) 题目大意给定 \(n\) 个非负整数 \(a_1 \cdots a_n\)。现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择。 求选出的数字的和最大。思路简析 一个比较好的思路是反向思考:选择某些间隔小于等于 \(k\) …

函数进阶应用2

进阶函数的具体应用场景查询并标记停产商品要求:停产商品标记为红颜色具体操作 选中B列——开始选项卡——条件规则——新建规则,选择“使用公式……格式的单元格”——在公式输入框中输入“=VLOOKUP(B2,选择区域,返回列,精确匹配)="停产”——格式,选填充色为红色—…

04 安装SSH

因为每一个老嵌入式都喜欢使用他的老windows进行开发,因此我决定使用SSH来开发rust,这样也不用在虚拟机里边再装一个vscode. 参考博客如何在windows下使用vscode连接linux虚拟机进行代码开发_windows vscode编辑linux文件-CSDN博客 Windows环境使用VSCode 调试Linux环境C/C++代…

Nuxt框架中内置组件详解及使用指南(四)

摘要:本文详细介绍了Nuxt 3框架中的两个内置组件:title: Nuxt框架中内置组件详解及使用指南(四) date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要:本文详细介绍了Nuxt 3框架中的两个内置组件:和的使用方法与示例。用于捕获并处理客户端错误,提供了错…

奇异值分解以及matlab实现

奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,具有压缩矩阵信息的作用 目录一、奇异值分解的理论介绍1.奇异值分解的例子2.U的计算3.V的计算4.Σ的计算5.利用SVD对数据进行"降维"(1)对U与V进行分块,得到分块矩阵(2)去除奇异值后…

php:安装phpredisadmin

一,项目代码地址: https://github.com/erikdubbelboer/phpRedisAdmin 二,下载: 从命令行用wget下载 [root@blog phpredisadmin]# wget https://github.com/erikdubbelboer/phpRedisAdmin/archive/refs/tags/v1.20.0.tar.gz 下载完成后解压缩 [root@blog phpredisadmin]# tar …

数学推导

基本公式 (a+b)%mod=(a%mod+b%mod)%mod 设一个任意整数\(A=a*10^n+b*10^{n-1}+...+c\). 由此可以证明 \(A \quad mod \quad m=(((a \quad mod \quad m)*10+b \quad mod \quad m)*10...)+c) \quad mod \quad m\) 该证明可以应用在数位DP点击查看代码 #include<bits/stdc++.h…

OpenDevin 简介:一个有抱负的 AI 驱动的软件开发平台

来源链接:https://medium.com/ai-advances/introduction-to-opendevin-the-aspiring-ai-powered-software-development-platform-11ffc69e60cc 发布时间:2024-05-05T00:40:39.078ZOpenDevin 是一个创新的开源项目,旨在通过引入一个自主的 AI 软件工程师来彻底改变软件开发。…

PM2 ecosystem 服务器自动化部署

一:准备工作 1.1 :将项目上传至代码管理库(github,gitlab,bitbucket,等) 1.2 :Windows 和 服务器 都安装SSH,Git 工具。 二:开始 2.1 本地生成ssh key连接服务器//根据邮箱生成ssh key ssh-keygen -t rsa -C "..........@163.com"//仔细看注释 //1.如果生成过…