当前位置: 首页 > news >正文

【设计模式】工厂模式与抽象工厂模式

工厂方法

以图书馆管理系统为例,需要API提供查询不同专业分类的书目列表,一般实现,

class LibraryManager {
public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type == TA) {return ...;} else if (type == TB) {} else if (...) {//...} else {return type_null;}        }
};

可以把构建返回对象,提取到工厂类,

class BookFactory {
public:Booklist CreateBooklist(Type type) {if(type == TA) {return ...;} else if (type == TB) {} else if (...) {//...} else {return type_null;} }
};
class LibraryManager {
public:LibraryManager(BookFactory factory) {this.factory_ = factory;}BookList Query(Type type) {return this.factory.CreateBooklist(type);}
private:this.factory_;
};

现在增加一个需求,增加文学书籍类,专业类、文学类都要支持按语种检索,工厂模式便于对新增需求的扩展,

class BookFactory {
public: virtual Booklist CreateBooklist(Type type) = 0;
}
class LanguageBookFactory: public BookFactory {
public: Booklist CreateBooklist(Type type) {//}
};
class ProfessionalBookFactory: public BookFactory {
public: Booklist CreateBooklist(Type type) {//}
};

抽象工厂方法

另一个场景,读者查、借还书都需要管理系统从数据库查询书籍、读者账户系统,同时考虑系统未来用不同的第三方数据库,如何设计呢?

class LibraryManager {
public:void QueryDB() {if(config_.db_type == MYSQL) {//具体实现} else if(config_.db_type == SQLLITE) {...} else {...}        }
private:
Config config_;
};

用统一的工厂接口提供获取数据的功能,

class DataFactory {
public:virtual ReaderInfo RetriveReaderInfo() = 0;virtual BookInfo RetriveBookInfo() = 0;
};
class DataFactoryMysql: public DataFactory {
//具体实现
}
class DataFactorySqllite: public DataFactory {
//具体实现
}
class LibraryManager {
public:void QueryDB() {if(config_.db_type == MYSQL) {auto mysql = std::make_shared<DataFactoryMysql>();mysql->RetriveReaderInfo();} else if(config_.db_type == SQLLITE) {...} else {...}        }

相关文章:

【设计模式】工厂模式与抽象工厂模式

工厂方法 以图书馆管理系统为例&#xff0c;需要API提供查询不同专业分类的书目列表&#xff0c;一般实现&#xff0c; class LibraryManager { public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type TA) {return ...;} else if (type TB) {} el…...

使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件

plasmo&#xff1a;GitHub - PlasmoHQ/plasmo: &#x1f9e9; The Browser Extension Framework plasmo是一个开发浏览器插件的框架&#xff0c;支持使用react和vue等技术&#xff0c;而且不用手动管理manifest.json文件&#xff0c;框架会根据你在框架中的使用&#xff0c;自…...

python并发 惰性处理大型数据集

惰性计算是一种编程策略&#xff0c;它使得程序在何时执行计算的决定推迟到需要结果时才进行。这种策略的好处在于&#xff0c;它允许程序处理大规模数据或者需要大量计算的任务时节省内存和计算资源。 举例来说&#xff0c;当我们调用 Python 中的 range() 函数时&#xff0c…...

Docker将本地的镜像上传到私有仓库

使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…...

[LeetBook]【学习日记】有效数字——状态机

题目 有效数字 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格一个小数或者整数&#xff08;可选&#xff09;一个’e’或’E’&#xff0c;后面跟着一个整数若干空格 小数&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a…...

学习目标2024

技术: 什么是 Nacos apifox 业务: 域统一...

引入js,刷新清除缓存

一、这种会让所有的css/js资源重新加载 <meta http-equiv"pragram" content"no-cache"> <meta http-equiv"cache-control" content"no-cache, no-store, must-revalidate">二、加时间戳 每次引入&#xff0c;后面版本号都…...

【VSCODE修改代码行间距】解决方案

在我们编码的过程中&#xff0c;由于显示字体和显示器的不同&#xff0c;会需要调整行间距&#xff0c;在vscode默认的选项中没有看到设定行间距的选项&#xff0c;不过&#xff0c;可以手动修改配置档达到目的。 1.打开设置 2.打开配置档&#xff0c;手动进行设定 3.在选项中添…...

lvs+keepalive

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 协议版本: VRRPv2&#xff08;常用&…...

用spark读取及存储数据

文章目录 读取数据存储数据 读取数据 data spark.sql("""select * from temp.tables""") data.show(3)# 转成pandas方式 # df data.toPandas() # df.head(3)存储数据 table "temp.new_tables" data.write.format("hive"…...

蓝牙 | 软件: Qualcomm BT Audio 问题分析(4)----检查MIPS使用情况

大家好&#xff01; 我是“声波电波还看今朝”成员的一位FAE Devin.wen&#xff0c;欢迎大家关注我们的账号。 今天给大家大概讲解“如何排查Qualcomm BT Audio”的疑难杂症&#xff08;四&#xff09;&#xff1a;MIPS检查。 如果大家还没有注册我们大大通的账号&#xff0c…...

【实战】K8S集群部署nacos并接入Springcloud项目容器化运维

文章目录 前言Nacos集群搭建Spring cloud配置nacos将Springcloud项目部署在k8s写在最后 前言 相信很多同学都开发过以微服务为架构的系统&#xff0c;开发微服务必不可少要使用注册中心&#xff0c;比如nacos\consul等等。当然在自动化运维流行的今天&#xff0c;我们也会将注…...

prometheus监控zookeeper方案

这里要求zookeeper版本必须达到3.6或以上&#xff0c;用的是官方自带的监控信息。 官方下载地址 https://zookeeper.apache.org/releases.html#download 然后在zookeeper的配置文件&#xff0c;比如zoo.cfg最后面加上这一段 metricsProvider.classNameorg.apache.zookeeper.…...

智能照明控制系统的优点有哪些

智能照明控制系统在会展中心中应用的功能和优点&#xff1a; 1实现照明控制智能化 在使用智能照明控制系统之后&#xff0c;能够将系统工作在全自动的状态下&#xff0c;系统能够预先设置好若干个基本切换状态&#xff0c;并且还能够根据预先设定的时间自动的在展馆各种工作状…...

Cent OS 安装 vmware tools

一、先挂载iso镜像 二、使用blkid命令&#xff0c;可看到/dev/sr0 blkid 创建一个目录并挂载cdrom mkdir /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom/ 挂载完成后&#xff0c;在/mnt/cdrom/目录即可看到一个.tar.gz的包VMwareTools-10.1.7-5541682.tar.gz&#x…...

写一个关于RN的分秒毫秒组件(组件状态由同一个父组件控制)

介绍一下,就一个界面会一直跑时间,项目有个需求需要用到毫秒级计时器,那我肯定想到用组件了塞,但是组件的状态和组件的数据都是不互通的都是独立的,因此我写了下面这个组件,组件的状态会由父组件控制切记&#xff0c;必须是同一个父组件&#xff0c;因为状态是父组件控制的&…...

javascript中字符串处理,常用的方法汇总

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 字符串对象的的相关方法1.获取字符串长度 length2.通过索引获取元素 …...

STM32CubeMX学习笔记14 ---SPI总线

1. 简介 1.1 SPI总线介绍 SPI 是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在…...

Gson(List<Object>转String 、String转List<Object>)

要在Java项目中使用Gson库&#xff0c;你需要添加相应的依赖项。以下是在Maven项目的pom.xml文件中添加Gson依赖的示例&#xff1a; <dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>&l…...

uniapp路由跳转的方式

1. uniapp路由跳转的方式 1.1. uni.navigateTo保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。 uni.navigateTo({url:./index/index });注意&#xff1a; &#xff08;1&#xff09;页面跳转路径有层级限制&#xff0c;不…...

【亲测免费】 Realtek-RTD2660源代码:开启显示设备定制化的新纪元

Realtek-RTD2660源代码&#xff1a;开启显示设备定制化的新纪元 【下载地址】Realtek-RTD2660源代码源程序 本仓库提供Realtek-RTD2660源代码源程序的下载。该资源文件适用于7至19寸的显示设备&#xff0c;为开发者提供了完整的源代码&#xff0c;方便进行二次开发和定制 项目…...

转:调动员工积极性的七个关键

个人理解&#xff1a; 经营的原点&#xff0c;就是“调动员工的积极性” 讲述自己的哲学&#xff0c;与员工们共有这种哲学 思想意识发生变化&#xff0c;积极性、主动性提高 稻盛和夫&#xff1a;调动员工积极性的七个关键 稻盛和夫&#xff1a;调动员工积极性的七个关键 稻…...

从Django后台到Celery Worker:一个完整用户注册邮件异步发送的部署实录

从Django后台到Celery Worker&#xff1a;一个完整用户注册邮件异步发送的部署实录 在Web应用开发中&#xff0c;用户注册流程是每个系统必备的基础功能。当新用户完成注册表单提交后&#xff0c;系统通常需要发送欢迎邮件或激活链接。如果直接在请求响应周期内执行邮件发送&am…...

FPGA加速储层计算:DPRR设计与时序数据处理优化

1. 储层计算与FPGA加速概述储层计算&#xff08;Reservoir Computing&#xff09;作为递归神经网络&#xff08;RNN&#xff09;的一种高效训练范式&#xff0c;近年来在时序数据处理领域展现出独特优势。与传统RNN需要调整所有连接权重不同&#xff0c;储层计算的核心思想是仅…...

FreeRTOS SMP多核调试踩坑记:在TC397上如何确认你的任务真的跑在了对的CPU核心?

TC397多核调试实战&#xff1a;如何验证FreeRTOS任务真的跑在指定核心&#xff1f; 调试多核系统就像在迷宫中寻找出口——即使代码看起来正确&#xff0c;任务也可能悄悄溜到错误的核心上执行。当LED闪烁频率异常、任务响应延迟或系统出现难以解释的锁死时&#xff0c;开发者首…...

今日算法(依旧二叉树)

class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {//递归进行&#xff0c;加回溯过程if(rootq||rootp||rootNULL) return root;TreeNode*leftlowestCommonAncestor(root->left,p,q);TreeNode*rightlowestCommonAncestor…...

【GPT-4V全面评估】:大语言多模态模型的黎明时代

多模态大模型时代的黎明&#xff1a;GPT-4V(ision)全面能力深度测评 当AI还在为"看图说话"磕磕绊绊时&#xff0c;GPT-4V已经悄悄解锁了"看懂世界"的超能力。它不仅能识别图片里的物体&#xff0c;还能理解梗图的笑点、解数学题、读X光片、甚至帮你操作电脑…...

【小白适用】2026 最新 Win11 OpenClaw 一键安装步骤(包含安装包)

OpenClaw&#xff08;小龙虾&#xff09;Windows 11 一键部署教程&#xff5c;2026 最新版&#xff5c;零代码・免配置・解压即用 适用系统&#xff1a;Windows 11 专业版 / 家庭版 / 正式版&#xff08;全版本兼容&#xff09;项目介绍&#xff1a;OpenClaw 是 GitHub 星标 2…...

Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Python 开发者三步接入 Taotoken 调用 GPT 与 Claude 模型 对于习惯使用 OpenAI 官方 Python SDK 的开发者来说&#xff0c;接入 T…...

网安工具系列python系列【仅供参考】:Python实战:利用fofa API高效搜索网络资产

Python实战:利用fofa API高效搜索网络资产 Python实战:利用fofa API高效搜索网络资产 1. 从零开始:为什么你需要一个自动化的资产搜索工具? 2. 动手前的准备:你的fofa账户和Python环境 2.1 获取你的fofa API凭证 2.2 搭建Python脚本环境 3. 核心代码拆解:一行行理解搜索脚…...