设计模式-抽象工厂模式
在设计模式中,抽象工厂模式(Abstract Factory Pattern)是一个非常常见且重要的模式,它属于创建型模式,用于提供创建一组相关或相互依赖对象的接口,而无需指定具体类。它的核心思想是将“创建对象”这一功能封装到工厂类中,从而避免了直接实例化具体对象,进而实现了解耦。
抽象工厂模式适用于以下场景:
- 需要生成多个相关对象,而这些对象往往具有相似的接口或行为。
- 系统需要独立于其产品的创建、组合和表示。
- 需要提供一个产品族,而每个产品族中的产品有类似的结构或行为。
在这篇文章中,我们将详细讲解抽象工厂模式的概念、结构、实现方式、优缺点以及使用场景,并通过一个实例帮助你更好地理解这一设计模式。
1. 抽象工厂模式的概念
抽象工厂模式定义了一个接口,用于创建相关的对象。它并不具体指明如何创建每一个对象,而是将具体的对象创建过程交给其子类来完成。通过这种方式,系统可以在不修改代码的情况下更容易地引入新的产品族。
1.1 主要角色
抽象工厂模式通常包括以下几个角色:
- AbstractFactory(抽象工厂):定义创建一系列相关产品的接口。每个具体工厂类都实现这个接口。
- ConcreteFactory(具体工厂):实现了创建具体产品对象的操作,负责创建产品族中的每个产品。
- AbstractProduct(抽象产品):为每种产品定义一个接口,规定了产品的基本行为。
- ConcreteProduct(具体产品):实现了抽象产品定义的接口,表示一类具体的产品。
- Client(客户端):使用抽象工厂和抽象产品的接口,依赖于具体的工厂对象来创建产品。
通过这些角色,抽象工厂模式的目标是让客户端通过抽象工厂类来创建产品,而无需关心产品的具体实现。
2. 抽象工厂模式的结构
以下是一个典型的抽象工厂模式的结构图:图像来源
2.1 解释
- AbstractFactory(抽象工厂)定义了创建
ProductA
和ProductB
等产品的方法。 - ConcreteFactory(具体工厂)实现了抽象工厂接口的具体方法,返回一个或多个具体的产品。
- AbstractProduct(抽象产品)定义了产品的接口,所有具体产品都需要实现这些接口。
- ConcreteProduct(具体产品)实现了抽象产品接口,代表了具体的产品。
3. 抽象工厂模式的实现
下面我们通过一个简单的例子来展示抽象工厂模式的实现过程。假设我们要开发一个界面库,支持多种操作系统(如 Windows 和 MacOS),每个操作系统下都有不同风格的按钮和输入框。
3.1 定义抽象产品
首先,定义一些抽象产品(如按钮和输入框)的接口。
"""
两个抽象产品类,AbstractButton、AbstractTextField
"""
from abc import ABC, abstractmethod# 抽象产品 - 按钮
class AbstractButton(ABC):@abstractmethoddef click(self):pass# 抽象产品 - 输入框
class AbstractTextField(ABC):@abstractmethoddef render(self):pass
3.2 定义具体产品
接下来,我们为每个操作系统实现具体的产品类。
"""
四个具体产品类
"""# Windows平台的按钮和输入框
class WindowsButton(AbstractButton):def click(self):return "Windows Button Clicked!"class WindowsTextField(AbstractTextField):def render(self):return "Windows TextField Rendered!"# MacOS平台的按钮和输入框
class MacButton(AbstractButton):def click(self):return "Mac Button Clicked!"class MacTextField(AbstractTextField):def render(self):return "Mac TextField Rendered!"
3.3 定义抽象工厂
然后,定义一个抽象工厂类,声明创建按钮和输入框的抽象方法。
# 定义了一个抽象工厂类,并定义了两个抽象方法:create_button、create_text_fieldclass AbstractUIFactory(ABC):@abstractmethod def create_button(self) -> AbstractButton: pass @abstractmethod def create_text_field(self) -> AbstractTextField: pass
3.4 定义具体工厂
实现具体的工厂类,用于创建具体的产品。
"""
定义了两个具体工厂,分别是WindowsFactory、MacFactory
这两个工厂分别实现了windows下和mac下的create_button、create_text_field
"""# Windows工厂
class WindowsFactory(AbstractUIFactory):def create_button(self) -> AbstractButton:return WindowsButton()def create_text_field(self) -> AbstractTextField:return WindowsTextField()# Mac工厂
class MacFactory(AbstractUIFactory):def create_button(self) -> AbstractButton:return MacButton()def create_text_field(self) -> AbstractTextField:return MacTextField()
3.5 客户端代码
最后,在客户端代码中,我们使用工厂来获取特定平台的产品。
"""
定义了一个客户端,客户端接收一个具体工厂实例,然后分别调用工厂里的create_button、create_text_field
由于工厂不同,从而生产出了不的产品
"""def client_code(factory: AbstractUIFactory):button = factory.create_button()text_field = factory.create_text_field()print(button.click())print(text_field.render())# 使用 Windows 工厂
print("Windows Factory:")
windows_factory = WindowsFactory()
client_code(windows_factory)# 使用 Mac 工厂
print("\nMac Factory:")
mac_factory = MacFactory()
client_code(mac_factory)
3.6 运行结果
Windows Factory:
Windows Button Clicked!
Windows TextField Rendered!
Mac Factory:
Mac Button Clicked!
Mac TextField Rendered!
4. 抽象工厂模式的优缺点
4.1 优点
- 产品一致性保证:抽象工厂模式确保每个产品族中的产品能够一致地搭配使用,避免了不兼容的产品组合。
- 可扩展性强:如果需要支持新的产品族,只需添加新的具体工厂和具体产品,而不需要修改现有的代码,这符合“对扩展开放,对修改关闭”的设计原则。
- 解耦:客户端代码不依赖于具体的产品类,只依赖于抽象工厂和抽象产品,减少了类之间的耦合。
4.2 缺点
- 增加了系统的复杂性:每新增一个产品族,就需要创建新的工厂类和产品类,系统的类数目会迅速增加,导致代码维护变得复杂。
- 难以支持不同种类的产品族:如果系统中需要支持大量不同种类的产品族,可能会导致工厂类变得非常庞大,难以维护。
5. 适用场景
- 需要生成多个相关或相互依赖的产品对象,而这些对象的接口可能会有差异。
- 系统要独立于产品的创建、组合和表示,并且产品的具体实现可能会随时发生变化。
- 需要确保产品的一致性,并且产品的不同实现或种类在某些场合下不能互换使用。
6. 抽象工厂模式与工厂方法模式的区别
抽象工厂模式(Abstract Factory Pattern)和工厂方法模式(Factory Method Pattern)都是属于创建型设计模式,它们的目标是通过引入工厂类来封装对象的创建过程,从而达到解耦的目的。不过,它们之间有一些关键的区别。
特性 | 工厂方法模式 (Factory Method Pattern) | 抽象工厂模式 (Abstract Factory Pattern) |
---|---|---|
定义 | 定义一个创建对象的接口,让子类决定实例化哪一个类。 | 提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体类。 |
类的结构 | 只有一个工厂方法,通常有一个抽象工厂类和多个具体工厂类,每个工厂类负责创建一个具体产品。 | 包含多个工厂方法,用于创建多个相关的产品,每个产品有对应的工厂类。 |
产品的数量 | 只创建一种产品。 | 创建一系列相关或相互依赖的产品。 |
产品的依赖关系 | 各个产品之间没有直接的依赖关系。 | 各个产品之间存在依赖关系,通常需要一个产品族。 |
客户端角色 | 客户端通过调用具体工厂的工厂方法来创建一个产品。 | 客户端通过抽象工厂来获取多个相关的产品,而无需知道这些产品的具体实现类。 |
扩展性 | 通过新增具体工厂和具体产品来扩展,但扩展较为简单。 | 通过新增具体工厂和产品族来扩展,通常扩展相对复杂,需要增加新的产品族和多个具体产品类。 |
适用场景 | 用于需要创建单个产品的场景,且产品的变化较少。 | 用于需要创建多个相关产品的场景,尤其是当产品之间存在依赖关系时,确保产品的一致性和兼容性。 |
实例 | 例如,汽车工厂可以生产一辆车(一个产品),不同工厂生产不同品牌的车(不同具体产品)。 | 例如,用户界面框架,Windows 和 MacOS 上的按钮、输入框等一组产品需要被创建(一个产品族)。 |
实现复杂度 | 相对较简单,主要通过工厂方法来实现对象的创建。 | 相对较复杂,需要设计多个工厂方法和产品类,且每个工厂方法可能创建多个相关产品。 |
- 工厂方法模式注重于创建单一产品的实例,主要通过定义一个工厂方法来实现。
- 抽象工厂模式则是用来创建多个相关或相互依赖的产品,它不仅仅是创建一个产品,而是创建一整套产品族。
- 工厂方法模式:当系统只需要创建一个产品时,或者有多个具体工厂,但每个工厂只负责一个产品的创建。
- 抽象工厂模式:当系统需要创建一系列相关的产品时,例如涉及到多个产品族时,可以通过抽象工厂来进行管理。
相关文章:
设计模式-抽象工厂模式
在设计模式中,抽象工厂模式(Abstract Factory Pattern)是一个非常常见且重要的模式,它属于创建型模式,用于提供创建一组相关或相互依赖对象的接口,而无需指定具体类。它的核心思想是将“创建对象”这一功能…...
webpack
前言 在现代前端开发的浪潮中,Webpack 已经成为一个不可或缺的构建工具。它不仅能够帮助我们打包 JavaScript 代码,还能够处理各种资源(如 CSS、图片、字体等),并提供一系列优化手段,极大地提升开发效率和…...
BLIP论文笔记
论文地址 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 论文思想 其实Clip就相当于只用了ITC...
Java List 集合详解:基础用法、常见实现类与高频面试题解析
正文 在 Java 集合框架中,List 是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。 👉点击获取2024Java学习资料 1…...
HTML5 SSE
HTML5 SSE(Server-Sent Events,服务器发送事件)是一种允许服务器实时向浏览器推送数据的技术。它是HTML5规范的一部分,主要通过HTTP协议实现。SSE的主要特点包括: 单向通信:与WebSocket不同,SSE…...
SpringBoot篇(监控)
目录 学习前言 一、什么是监控? 二、监控的意义 1. 简介 2. 总结 3. 思考 三、可视化监控平台 1. 简介 2. 实操 2.1. 服务端开发 2.2. 客户端开发 配置多个客户端 2.3. 总结 2.4. 思考 四、监控原理 1. 简介 2. 总结 五、自定义监控指标 1. 简介…...
python23-常用的第三方库01:request模块-爬虫
requests 模块是 Python 中的一个第三方库,用于发送 HTTP 请求。 它提供了一个简单且直观的 API,使得发送网络请求和解析响应变得非常容易。requests 模块支持各种 HTTP 方法,如 GET、POST、PUT、DELETE 等,并且具有处理 cookies…...
【pytorch】现代卷积神经网络
文章目录 1 AlexNet2 VGG3 NiN4 GoogLeNet5 批量规范化batch normalization6 ResNet6.1 残差块6.2 resnet 7 DenseNet7.1 稠密块体7.2 过渡层7.3 DenseNet模型 1 AlexNet AlexNet由八层组成:五个卷积层、两个全连接隐藏层和一个全连接输出层。 AlexNet使用ReLU而不…...
Excel 身份证号计算年龄
1. 设置身份证号列格式 复制身份证列值到记事本或其他地方重新设置身份证号列单元格格式为“文本”将复制出去的身份证号重新复制粘贴回来 2. 年龄列单元格中添加公式 DATEDIF(DATE(LEFT(MID(A2, 7, 8), 4), MID(MID(A2, 7, 8), 5, 2), RIGHT(MID(A2, 7, 8), 2)), TODAY(), …...
【ArcGIS Pro】完整的nc文件整理表格模型构建流程及工具练习数据分享
学术科研啥的要用到很多数据,nc文件融合了时间空间数据是科研重要文件。之前分享过怎样将nc文件处理成栅格后整理成表格。小编的读者还是有跑不通整个流程的,再来做一篇总结篇,也分享下练习数据跟工具,如果还是弄不了的࿰…...
WebRTC的线程模型
WebRTC中的线程类: Thread类: (1)Thread类中的数据: class Thread {// 消息队列:MessageList messages_; // 消息队列,所有需要线程处理的消息,都要先入队PriorityQueue delayed_m…...
活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化
课程介绍 参加“Microsoft Power Platform 在线技术公开课:实现业务流程自动化”活动,了解如何更高效地开展业务。参加我们举办的本次免费培训活动,了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…...
Docker安装(Docker Engine安装)
一、Docker Engine和Desktop区别 Docker Engine 核心组件:Docker Engine是Docker的核心运行时引擎,负责构建、运行和管理容器。它包括守护进程(dockerd)、API和命令行工具客户端(docker)。适用环境&#…...
Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)
一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …...
Llama系列关键知识总结
系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 第三章:LLaVA模型讲解与总结 文章目录 系列文章目录Llama: Open and Efficient Foundation Language Models关键要点LLaMa模型架构:Llama2分组查询注意力 (G…...
分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…...
flink cdc使用flink sql方式运行一直报Make sure a planner module is on the classpath
flink cdc使用flink sql方式运行一直报Make sure a planner module is on the classpath 引入jar包信息: flink-connector-oracle-cdc:3.2.1 flink:1.20.0 flink-table-runtime:1.20.0 flink-streaming-java:1.20.0 flink-clients:1.20.0 Exception in thread &q…...
Vue.js组件开发-怎样将style私有化
Vue.js组件开发中,将style私有可以通过使用<style scoped>来实现的。scoped属性会告诉Vue为这个组件的CSS样式添加一个数据属性,从而确保这些样式只应用于该组件的元素,而不会影响到其他组件或全局样式。 示例: 展示如何使…...
第十届“挑战杯”大学生课外学术科技作品竞赛解析及资料
“挑战杯”被誉为大学生科技创新创业的“奥林匹克”盛会,它汇聚了来自各个学科、各个年级的精英人才。在这里,同学们带着对未知的好奇和对知识的渴望,组成一个个团队,向难题发起挑战。现在,第十届“挑战杯”大学生课外…...
从0入门自主空中机器人-2-1【无人机硬件框架】
关于本课程: 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程,包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程,带你从0开始,组装属于自己的自主无人机,并让…...
跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验
硬件平台:征战Pro开发板 软件平台:Vivado2018.3 仿真软件:Modelsim10.6d 文本编译器:Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 LED,又名…...
【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(四)
****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 四、提示范式(Explanation for Prompting Paradigm) 随着语言模型规模的扩大,基于提示(prom…...
分布式算法(五):初识ZAB协议
文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…...
用Python操作字节流中的Excel工作簿
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…...
PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架
PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架,支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容: http…...
MIT S081 Lab 2 System Calls
Lab链接 一 实现trace功能 1 题目要求 In this assignment you will add a system call tracing feature that may help you when debugging later labs. You’ll create a new trace system call that will control tracing. It should take one argument, an integer “ma…...
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库 目录 Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库一、配置…...
(leetcode算法题)10. 正则表达式匹配
10. 正则表达式匹配 - 力扣(LeetCode) 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串…...
Hive性能调优考量
Hive作为大数据领域常见的数据仓库组件,在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大,数据倾斜、job(小文件过多)或者磁盘I/O过多、MapReduce分配不合理等因素都会对Hive的效率有影响。对Hive的调优可以从架构…...
2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。
文章目录 sklearn学习(26) 模型选择与评估-交叉验证:评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…...
Spring Boot + MinIO 实现分段、断点续传,让文件传输更高效
一、引言 在当今的互联网应用中,文件上传是一个常见的功能需求。然而,传统的文件上传方式在面对大文件或不稳定的网络环境时,可能会出现性能瓶颈和上传失败的问题。 传统文件上传,就像是用一辆小推车搬运大型家具,一…...
获取用户详细信息-ThreadLocal优化
Thread全局接口可用,不用再重复编写。所以为了代码的复用,使用Thread。把之前的内容(函数的参数和map与username)注释掉,换为Thread传过来的内容(map与username)。 因为Thread需要在拦截器里面…...
R语言6种将字符转成数字的方法,写在新年来临之际
咱们临床研究中,拿到数据后首先要对数据进行清洗,把数据变成咱们想要的格式,才能进行下一步分析,其中数据中的字符转成数字是个重要的内容,因为字符中常含有特殊符号,不利于分析,转成数字后才能…...
Go语言方法和接收器类型详解
Go语言方法和接收器类型详解 1. 方法接收器类型 1.1 值接收器 值接收器方法不会改变接收器的状态,因为Go语言会在调用时复制接收器的值。因此,任何对接收器成员变量的修改都只会影响副本,而不会影响原始结构体实例。 type Person struct …...
Linux常用命令总结
目录 查询java服务的pid查询pid上的进程占用的端口方法 1:使用 lsof 查询端口方法 2:使用 netstat 查询端口方法 3:使用 ss 命令查询端口 system相关命令 查询java服务的pid JPS查询pid上的进程占用的端口 要根据进程 ID(PID&am…...
Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录
Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…...
ROS2软件架构全面解析-学习如何设计通信中间件框架
前言 ROS(Robot Operating System) 2 是一个用于开发机器人应用的软件平台,也称为机器人软件开发工具包 (SDK)。 ROS2是ROS1的迭代升级版本 ,最主要的升级点是引入DDS(Data Distribution Service)为基础的…...
基于微信小程序的校园自助打印系统
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...
Linux命令——3.网络与用户
文章目录 一、网络1.网络测试与诊断2.网络接口配置3.无线网络配置4.防火墙与网络管理6.防火墙管理1)firewalld命令2)iptables命令 二、用户和群组1.管理员模式2.用户账户管理1)useradd创建2)usermod修改3)userdel 删除…...
2、redis的持久化
redis的持久化 在redist当中,高可用的技术包括持久化,主从复制,哨兵模式,集群。 持久化是最简单的高可用的方法,作用就是备份数据。即将数据保存到硬盘,防止进程退出导致数据丢失。 redis持久化方式&…...
建造者模式 Builder Pattern
在创建一个对象的时候,构造器参数有点多,而且有些参数还是可选的,再者还有不少同类型的,那就更应该使用 builder 模式了。 使用 Builder 模式的初衷是 把易变性(mutability)移动到Builder类,而…...
制作一个类似ChatGPT的AI对话网站,模型能力使用ChatGPT
要快速搭建一个类似ChatGPT的AI对话网站,并且使用类似ChatGPT的模型能力,可以考虑以下技术和工具: ### 1. **使用现有的AI模型平台** - **OpenAI API**: 如果你希望使用类似于ChatGPT的能力,OpenAI提供了强大的API服务(…...
LinuxC高级day2
1.在家目录下创建目录文件,dir a.dir下创建dir1和dir2 b.把当前目录下的所有文件拷贝到dir1中, c.把当前目录下的所有脚本文件拷贝到dir2中 d.把dir2打包并压缩为dir2.tar.xz e.再把dir2.tar.xz移动到dir1中 f.解压dir1中的压缩包 g.使用tree工具&#x…...
Word格式修改
经常修改格式,留下这篇汇总 Word的累加符号上下标变右标指定目录:word如何取消封面或者目录下方的页码,页码从正文开始加参考文献:【Word】怎样给论文添加引用参考文献删空白页: word中无法删除空白页怎么办ÿ…...
深度学习-稀疏卷积
步骤: 1、构建输入输出哈希表; 输入哈希表的键为激活点的索引,值为激活点的坐标;输出哈希表的键为激活点对应的输出点的索引,值为输出点的坐标。 2、构建规则书; 规则书的每一行包含4个值,分别是…...
Microsoft Visual Studio中的/MT, /MTd,/MD,/MDd分别是什么意思?
1. /MT,/MTd,/MD,/MDd的含义 /MT,/MTd,/MD,/MDd是 Microsoft Visual C 编译器的运行时库链接选项。它们决定了程序如何链接 C 运行时库(CRT)。具体含义如下: /MT&#x…...
交换机关于环路、接口绑定、链路聚合的相关知识
文章目录 1、对交换机SW-1进行配置,仅允许Host-1通过Ethernet0/0/1接口与Host-3和Host-4通信,Host-2无法与其他主机通信。2、关闭生成树协议,验证环路造成的影响3、关闭生成树协议通过链路聚合实现两条链路正常通信并提高链路可靠性。 内容包…...
5.微服务灰度发布落地实践(rocketmq增强)
文章目录 前言发送端灰度增强订阅端灰度增强 前言 上一篇分析了,在灰度发布实现中为什么要对消息队列灰度发布进行增强。本篇主要介绍如何实现rocketmq 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...
32单片机从入门到精通之开发环境——库文件(六)
每个人都有自己的追求和梦想,但要实现这些梦想并不容易。在追逐梦想的路上,我们会遇到各种困难和挫折,甚至会感到无助和失望。然而,正是这些困难和挫折让我们更加坚韧和坚定地追求自己的目标。不要害怕失败,失败只是暂…...
大电流和大电压采样电路
大电压采样电路: 需要串联多个电阻进行分压,从而一级一级降低电压,防止电阻损坏或者短路直接打穿MCU。 为什么需要加电压跟随器:进行阻抗的隔离,防止MCU的IO阻抗对分压产生影响: 大电流检测电路ÿ…...