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

Python设计模式:工厂模式

1. 什么是工厂模式?

工厂模式是一种创建对象的设计模式,它提供了一种创建对象的接口,但不暴露对象创建的具体逻辑。工厂模式的核心思想是将对象的创建与使用分离,从而提高代码的灵活性和可维护性。

1.1 工厂模式的类型

1.1.1 简单工厂模式(Simple Factory Pattern)

简单工厂模式通过一个工厂类来创建不同类型的对象。工厂类根据传入的参数决定创建哪种类型的对象。这种模式并不属于 GoF 设计模式中的 23 种设计模式,但在实际应用中非常常见。

# 产品接口
class Product:def operation(self):pass# 具体产品类
class ConcreteProductA(Product):def operation(self):return "Result of ConcreteProductA"class ConcreteProductB(Product):def operation(self):return "Result of ConcreteProductB"# 工厂类
class SimpleFactory:@staticmethoddef create_product(product_type):if product_type == "A":return ConcreteProductA()elif product_type == "B":return ConcreteProductB()else:raise ValueError("Unknown product type")# 客户端代码
if __name__ == "__main__":factory = SimpleFactory()product_a = factory.create_product("A")print(product_a.operation())  # 输出: Result of ConcreteProductAproduct_b = factory.create_product("B")print(product_b.operation())  # 输出: Result of ConcreteProductB
  1. 产品接口:定义了一个产品接口 Product,具体产品类 ConcreteProductAConcreteProductB 实现了该接口。
  2. 工厂类SimpleFactory 类提供了一个静态方法 create_product,根据传入的参数创建不同类型的产品。
  3. 客户端代码:在客户端代码中,使用工厂类创建产品对象,而不需要直接依赖具体的产品类。

1.1.2 工厂方法模式(Factory Method Pattern)

工厂方法模式定义一个创建对象的接口,但由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。这种模式允许用户在不修改现有代码的情况下引入新产品。

# 产品接口
class Product:def operation(self):pass# 具体产品类
class ConcreteProductA(Product):def operation(self):return "Result of ConcreteProductA"class ConcreteProductB(Product):def operation(self):return "Result of ConcreteProductB"# 工厂接口
class Factory:def create_product(self):pass# 具体工厂类
class ConcreteFactoryA(Factory):def create_product(self):return ConcreteProductA()class ConcreteFactoryB(Factory):def create_product(self):return ConcreteProductB()# 客户端代码
if __name__ == "__main__":factory_a = ConcreteFactoryA()product_a = factory_a.create_product()print(product_a.operation())  # 输出: Result of ConcreteProductAfactory_b = ConcreteFactoryB()product_b = factory_b.create_product()print(product_b.operation())  # 输出: Result of ConcreteProductB
  1. 产品接口:定义了一个产品接口 Product,具体产品类 ConcreteProductAConcreteProductB 实现了该接口。
  2. 工厂接口:定义了一个工厂接口 Factory,包含一个创建产品的方法 create_product
  3. 具体工厂类ConcreteFactoryAConcreteFactoryB 实现了工厂接口,负责创建具体产品。
  4. 客户端代码:在客户端代码中,使用具体工厂类创建产品对象,而不需要直接依赖具体的产品类。

工厂方法模式的一个重要优点是它允许用户在不修改现有代码的情况下引入新产品。这是通过以下方式实现的:

  1. 扩展工厂类:用户可以创建新的工厂类,继承自工厂接口,并实现 create_product 方法,以创建新的产品类型。

  2. 扩展产品类:用户可以创建新的产品类,继承自产品接口,并实现其方法。

  3. 使用多态:客户端代码可以使用工厂接口来创建产品,而不需要知道具体的产品类。这使得在引入新产品时,客户端代码不需要进行任何修改。

假设我们要引入一个新的产品 ConcreteProductC 和一个新的工厂 ConcreteFactoryC

# 新的具体产品类
class ConcreteProductC(Product):def operation(self):return "Result of ConcreteProductC"# 新的具体工厂类
class ConcreteFactoryC(Factory):def create_product(self):return ConcreteProductC()# 客户端代码
if __name__ == "__main__":factory_a = ConcreteFactoryA()product_a = factory_a.create_product()print(product_a.operation())  # 输出: Result of ConcreteProductAfactory_b = ConcreteFactoryB()product_b = factory_b.create_product()print(product_b.operation())  # 输出: Result of ConcreteProductB# 使用新的工厂和产品factory_c = ConcreteFactoryC()product_c = factory_c.create_product()print(product_c.operation())  # 输出: Result of ConcreteProductC
  1. 新的具体产品类ConcreteProductC 实现了 Product 接口,提供了自己的 operation 方法。
  2. 新的具体工厂类ConcreteFactoryC 实现了 Factory 接口,负责创建 ConcreteProductC 实例。
  3. 客户端代码:在客户端代码中,创建了新的工厂 ConcreteFactoryC,并使用它来创建新的产品 ConcreteProductC。客户端代码无需修改,依然使用工厂接口来创建产品。

1.1.3 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式通常用于需要创建多个相关对象的场景。

# 产品接口
class ProductA:def operation_a(self):passclass ProductB:def operation_b(self):pass# 具体产品类
class ConcreteProductA1(ProductA):def operation_a(self):return "Result of ConcreteProductA1"class ConcreteProductA2(ProductA):def operation_a(self):return "Result of ConcreteProductA2"class ConcreteProductB1(ProductB):def operation_b(self):return "Result of ConcreteProductB1"class ConcreteProductB2(ProductB):def operation_b(self):return "Result of ConcreteProductB2"# 抽象工厂接口
class AbstractFactory:def create_product_a(self):passdef create_product_b(self):pass# 具体工厂类
class ConcreteFactory1(AbstractFactory):def create_product_a(self):return ConcreteProductA1()def create_product_b(self):return ConcreteProductB1()class ConcreteFactory2(AbstractFactory):def create_product_a(self):return ConcreteProductA2()def create_product_b(self):return ConcreteProductB2()# 客户端代码
if __name__ == "__main__":factory1 = ConcreteFactory1()product_a1 = factory1.create_product_a()product_b1 = factory1.create_product_b()print(product_a1.operation_a())  # 输出: Result of ConcreteProductA1print(product_b1.operation_b())  # 输出: Result of ConcreteProductB1factory2 = ConcreteFactory2()product_a2 = factory2.create_product_a()product_b2 = factory2.create_product_b()print(product_a2.operation_a())  # 输出: Result of ConcreteProductA2print(product_b2.operation_b())  # 输出: Result of ConcreteProductB2
  1. 产品接口:定义了两个产品接口 ProductAProductB,具体产品类实现了这些接口。
  2. 抽象工厂接口:定义了一个抽象工厂接口 AbstractFactory,包含创建产品的方法。
  3. 具体工厂类ConcreteFactory1ConcreteFactory2 实现了抽象工厂接口,负责创建一系列相关的产品。
  4. 客户端代码:在客户端代码中,使用具体工厂类创建产品对象,而不需要直接依赖具体的产品类。

1.2 工厂模式的优点

  • 解耦:客户端代码与具体的产品类解耦,客户端只需要依赖于工厂接口。
  • 灵活性:可以在不修改客户端代码的情况下引入新的产品类。
  • 易于扩展:可以通过添加新的工厂类和产品类来扩展系统。

1.3 工厂模式的应用场景

  • 当一个类不知道它所必须创建的对象的类时。
  • 当一个类希望通过子类来指定它所创建的对象时。
  • 当需要将对象的创建与使用分离时。

2. 示例 1:工厂模式在图形绘制应用中的应用

# 图形接口
class Shape:def draw(self):pass# 具体图形类
class Circle(Shape):def __init__(self, color):self.color = colordef draw(self):return f"Drawing a {self.color} Circle"class Rectangle(Shape):def __init__(self, color):self.color = colordef draw(self):return f"Drawing a {self.color} Rectangle"class Triangle(Shape):def __init__(self, color):self.color = colordef draw(self):return f"Drawing a {self.color} Triangle"class Square(Shape):def __init__(self, color):self.color = colordef draw(self):return f"Drawing a {self.color} Square"# 工厂类
class ShapeFactory:@staticmethoddef create_shape(shape_type, color):if shape_type == "Circle":return Circle(color)elif shape_type == "Rectangle":return Rectangle(color)elif shape_type == "Triangle":return Triangle(color)elif shape_type == "Square":return Square(color)else:raise ValueError("Unknown shape type")# 图形管理器
class ShapeManager:def __init__(self):self.shapes = []def add_shape(self, shape):self.shapes.append(shape)def draw_all(self):for shape in self.shapes:print(shape.draw())# 客户端代码
if __name__ == "__main__":shape_manager = ShapeManager()# 直接定义形状类型和颜色shapes_to_create = [("Circle", "Red"),("Rectangle", "Blue"),("Triangle", "Green"),("Square", "Yellow")]for shape_type, color in shapes_to_create:shape = ShapeFactory.create_shape(shape_type, color)shape_manager.add_shape(shape)# 绘制所有图形shape_manager.draw_all()
Drawing a Red Circle
Drawing a Blue Rectangle
Drawing a Green Triangle
Drawing a Yellow Square
  1. 图形接口:定义了一个图形接口 Shape,所有具体图形类(如 CircleRectangleTriangleSquare)都实现了该接口,并提供了 draw 方法。

  2. 具体图形类:每个具体图形类都有一个构造函数,接受颜色参数,并实现了 draw 方法,返回绘制该图形的描述。

  3. 工厂类ShapeFactory 类提供了一个静态方法 create_shape,根据传入的形状类型和颜色创建不同类型的图形对象。这样,客户端代码只需调用工厂方法,而不需要直接依赖具体的图形类。

  4. 图形管理器ShapeManager 类用于管理所有创建的图形对象。它可以添加图形并绘制所有图形。

  5. 客户端代码:在客户端代码中,直接定义了一个形状和颜色的列表,使用工厂类创建相应的图形对象,并将它们添加到图形管理器中。最后,调用 draw_all 方法绘制所有图形。

相关文章:

Python设计模式:工厂模式

1. 什么是工厂模式? 工厂模式是一种创建对象的设计模式,它提供了一种创建对象的接口,但不暴露对象创建的具体逻辑。工厂模式的核心思想是将对象的创建与使用分离,从而提高代码的灵活性和可维护性。 1.1 工厂模式的类型 1.1.1 简…...

UE5 给函数分类

如果函数太多不方便找,我们可以给函数设置一个分组 选中一个函数,修改它的类别 然后在函数列表里可以看到分好的类 其他函数可以直接拖进类别里,不用每个函数都手动设置类别 一次只能拖动一个函数...

5️⃣ Coze+AI应用基础教学(2025年全新版本)

目录 一、了解应用开发 1.1 扣子应用能做什么 1.2 开发流程 1.3 开发环境 二、快速搭建一个AI应用 2.1 AI翻译应用介绍 2.2 设计你的应用功能 2.3 创建 AI 应用项目 2.4 编写业务逻辑(新建工作流) 2.5 搭建用户界面 2.6 效果测试 2.7 发布应…...

高级前端题库

前端题库 JS篇 如何理解作用域和作用域链 作用域 作用域就是变量或函数在其内能够被访问的“可见区域” 全局作用域局部作用域 作用域链 当在某个作用域中尝试访问一个变量时,JS引擎会从当前作用域开始,沿着作用域链向上逐级开始查找,直到…...

博途 TIA Portal之1200做主站与汇川EASY的TCP通讯

前言,虽然已经做了几篇关于TCP通讯的文章,但是不同的PLC之间的配合可能不同,下面将演示这种差异。 关于汇川EASY做从站的配置请参见下方链接文章:汇川EASY系列之以太网通讯(套接字socket做从站)_汇川以太网tcp套接字fb块-CSDN博客 1、硬件准备: 1200PLC,汇川EASY320…...

在conda虚拟环境安装GIT并且克隆github上项目指南(解决443问题)

此次笔记记录自己在conda虚拟环境安装git,同时克隆github项目,并且解决了git的443问题。 如有不妥欢迎各位大佬批评指正。 首先默认你已经安装了anaconda。 代开命令提示行 配置环境 #首先创建虚拟环境 conda create -n git_env python3.8 #激活虚拟环…...

JavaWeb遇到的问题汇总

问题一:(键值对最后一项没有逗号) 在JSON字符串转自定义对象和自定义对象转JSON字符串时: 如图所示:若忘记删除键值对的最后一项没有逗号时,则下一句转换不会生效,应该删除最后一项的逗号。 解…...

Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)——项目学习记录

目录 前言 一、数据集:图像文本,部分选取于DeepFashion 二、优化一,img2img 三、优化二,微调sd参数 四、优化三,dreamshaper优化 五、优化四,sdv1.5contronet 六、问题探索历程 1. 从 SDXL 到轻量化模…...

【“星睿O6”AI PC开发套件评测】在O6开发板使用gemma-2b测试CPU性能

前提条件: x64 Linux 主机:安装CMake 和 arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu radxa O6主机 1.从 Kaggle 获取模型权重和分词器 Gemma 3 2B 模型文件:访问 Kaggle 上的 Gemma 模型页面 https://www.kaggle.com/mode…...

数学知识——矩阵乘法

使用矩阵快速幂优化递推问题 对于一个递推问题,如递推式的每一项系数都为常数,我们可以使用矩阵快速幂来对算法进行优化。 一般形式为: F n F 1 A n − 1 F_nF_1A^{n-1} Fn​F1​An−1 由于递推式的每一项系数都为常数,因此对…...

3DMax中模型解组

1、从网上下载下来的模型是一个整体,需要解开查看每个样式 2、解开组...

链路聚合+vrrp

1.链路聚合 作用注意事项将多个物理接口(线路)逻辑上绑定在一起形成一条逻辑链路,起到叠加带宽的作用1.聚合接口必须转发速率一致。2.聚合设备两端必须一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先创建聚合接口,…...

0 std::process::Command 介绍

std::process::Command 是 Rust 标准库中用于创建和配置子进程的主要类型。它允许你启动新的进程、设置其参数和环境变量、重定向输入/输出等。 基本用法 use std::process::Command;let output Command::new("echo").arg("Hello, world!").output().ex…...

Android 中Intent 相关问题

在回答 Intent 问题时,清晰区分其 定义、类型 和 应用场景。以下是的回答策略: 一、Intent 的核心定义 Intent 是 Android 系统中的 消息传递对象,主要用于三大场景: 2. 隐式 Intent(Implicit Intent) 三、…...

【Docker】Docker Desktop镜像存储路径设置方法

在 Docker Desktop 中设置镜像存储路径(即下载的镜像文件存放位置)取决于你的操作系统。以下是不同系统下的设置方法: Windows 系统 完全卸载后重新安装指定路径(Docker Desktop for Windows 默认使用 C:\ProgramData\Docker&…...

Spring Boot 3.x 中 WebClient 全面详解及示例

Spring Boot 3.x 中 WebClient 全面详解及示例 1. WebClient 简介 定义:Spring 5 引入的响应式 HTTP 客户端,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。核心特性: 支持所有 HTTP 方法&a…...

将图片按照指定大小批量进行裁剪(可设置步长_python)

将图片按照指定大小批量进行裁剪(可设置步长_python) import os from PIL import Image# 设置更高的图像大小限制,禁用解压炸弹检查 Image.MAX_IMAGE_PIXELS None # 禁用解压炸弹检查def crop_image(image_path, block_size(640, 640), step_size(340, 340)):# 打…...

设计模式 --- 原型模式

原型模式是创建型模式的一种,是在一个原型的基础上,建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销,我们可以使用原型模式来建立一个非常类似于复印机的…...

工作经验记录

坑 部门例会上:跨级暴露问题.部门例会上:说话没有条理,周报写得好,但是表达效果不同.领导直接要求的任务没有当时推进:需考虑GTD清单.不要马后炮领导签字要按顺序 会议上 发言有条理问题不要越级暴露不要强调过程 对同事 对领导 领导同意的文件最好当日通过. 对供应商 不…...

Unity中基于2.5D的碰撞系统

在2.5D游戏中实现精确的碰撞检测是一个关键挑战,因为我们需要在视觉上有深度感的同时保持游戏逻辑的准确性。下面我将详细解析2.5D碰撞系统的实现方法。 1. 2.5D碰撞的核心问题 1.1 Z轴深度与碰撞的关系 视觉表现:物体通过Y轴位置影响Z轴排序&#xff…...

设计模式-命令模式详解

命令模式详解及真实场景解决方案 模式定义 命令模式是一种行为设计模式,将请求封装为独立对象,包含执行操作所需的所有信息。通过这种方式,可以实现请求的参数化、队列管理、撤销/重做等高级功能,同时解耦请求发送者与接收者。 …...

基于Python(Django)+SQLite 实现(Web) 点菜管理系统

点菜管理系统 课程设计任务与要求 1、任务 题目:点菜管理信息系统 问题描述: 随着网络的迅速发展,越来越多的人开始接受甚至时依赖了网络营业的这种交易形式,传统的点菜模式不仅浪费时间,效率低下,而且…...

泰鸿万立上市:加强产品规划和前瞻性研发 打造优质汽车零部件制造商

4月9日,浙江泰鸿万立科技股份有限公司(股票简称“泰鸿万立”,股票代码“603210”)正式登陆上交所主板。 招股书显示,泰鸿万立主营业务为汽车结构件、功能件的研发、生产与销售。经过十余年发展,公司拥有了…...

Charles的安装和使用教程

Charles抓包工具与Sniff Master在Windows上的安装与使用指南 1. Charles抓包工具安装 1.1 下载Charles 进入Charles官网(https://www.charlesproxy.com/download/)下载最新版本的安装包 1.2 安装与激活 正常安装后,打开会提示试用版30天限制进入授权码生成页面…...

论文阅读笔记:Adaptive Multi-Modal Cross-Entropy Loss for Stereo Matching

论文阅读笔记:Adaptive Multi-Modal Cross-Entropy Loss for Stereo Matching 1 背景2 创新点3 方法4 模块4.1 基础和问题描述4.2 自适应多模态概率模型4.3 主模态视差估计器 5 效果6 结论 1 背景 尽管深度学习在立体匹配方面取得了巨大成功,但恢复准确…...

JavaScript学习教程,从入门到精通,JavaScript 运算符及语法知识点详解(8)

JavaScript 运算符及语法知识点详解 一、JavaScript 运算符 1. 算术运算符 用于执行数学运算: 加法- 减法* 乘法/ 除法% 取模(余数) 递增-- 递减** 幂运算(ES6) let a 10, b 3; console.log(a b); // 13 conso…...

聊聊Spring AI的ETL Pipeline

序 本文主要研究一下Spring AI的ETL Pipeline DocumentReader org/springframework/ai/document/DocumentReader.java public interface DocumentReader extends Supplier<List<Document>> {default List<Document> read() {return get();}}有TextReader…...

spark架构和RDD相关概念

运行架构&#xff1a; Spark采用master - slave结构&#xff0c;Driver作为master负责作业任务调度&#xff0c;Executor作为slave负责实际执行任务。 核心组件 Driver&#xff1a;执行Spark任务的main方法&#xff0c;将用户程序转化为作业&#xff0c;在Executor间调度任务&…...

Cloud Kernel SIG 季度动态:发布ANCK 6.6-003版本,支持一测多证

Cloud Kernel SIG&#xff08;Special Interest Group&#xff09;&#xff1a;支撑龙蜥内核版本的研发、发布和服务&#xff0c;提供生产可用的高性价比内核产品。 01 SIG 整体进展 发布 ANCK 6.6-003 版本。 一测多证流程建立。 OOT 驱动基线更新。 海光平台适配进展更新…...

【11】数据结构之基于线性表的查找算法

目录标题 平均查找长度ASL(Average Search Length)顺序表查找法折半查找法索引顺序查找法 平均查找长度ASL(Average Search Length) 定义&#xff1a;为确定元素在列表中的位置&#xff0c;需要和给定值进行比较的关键字个数的期望值&#xff0c;称之为查找算法成功时的平均查…...

铼赛智能Edge mini斩获2025法国设计大奖 | 重新定义数字化齿科美学

铼赛智能&#xff08;RAYSHAPE&#xff09;革命性新品——椅旁3D打印机Edge mini荣获2025年法国设计奖&#xff08;FRENCH DESIGN AWARDS&#xff0c;简称FDA&#xff09;产品设计类大奖。作为全球工业设计领域最具影响力的奖项之一&#xff0c;这一殊荣不仅是对产品极简美学的…...

成为一种国家战略范畴的新基建的智慧园区开源了

智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界…...

Codeforces Round 1016 (Div. 3)题解

题目地址 https://codeforces.com/contest/2093 锐评 在所有题意都理解正确的情况下&#xff0c;整体难度不算太难。但是偏偏存在F这么恶心的题意&#xff0c;样例都不带解释一下的&#xff0c;根本看不懂题。D题也恶心&#xff0c;在于递归过程的拆分&#xff0c;需要点数学…...

安全理念和安全产品发展史

从安全理念的发展历史来看,技术与产品的演进始终围绕 “威胁对抗” 与 “业务适配” 两大核心展开。以下从七个关键阶段解析安全技术与产品的发展脉络,并结合最新实践与未来趋势提供深度洞察: 一、密码学奠基阶段(1970s 前) 安全理念:以 “信息保密” 为核心,防御手段…...

【深度学习】Downstream Model:预训练模型的下游应用与微调技术

Downstream Model&#xff1a;预训练模型的下游应用与微调技术 文章目录 Downstream Model&#xff1a;预训练模型的下游应用与微调技术1 什么是Downstream Model&#xff08;下游模型&#xff09;2 预训练模型与下游任务的关系3 微调技术与迁移学习微调的必要性高效迁移学习参…...

每日算法-250409

这是我今天的算法学习记录。 2187. 完成旅途的最少时间 题目描述 思路 二分查找 解题过程 为什么可以使用二分查找&#xff1f; 问题的关键在于寻找一个最小的时间 t&#xff0c;使得在时间 t 内所有公交车完成的总旅途次数 sum 大于等于 totalTrips。 我们可以观察到时间的单…...

【CSS 选择器组合规则详解】

基础选择器组合 空格&#xff1a;后代选择器 > 直接子元素选择器 . 类选择器 : 伪类选择器 多类选择器 .class1.class2 &#xff1a;多类组合 .class1 .class2 &#xff1a;类的所有后代 .class1 > .class2 &#xff1a;类的子元素特殊选择器 :nth-child() :nth-of-…...

手机静态ip地址怎么获取?方法与解析‌

而在某些特定情境下&#xff0c;我们可能需要为手机设置一个静态IP地址。本文将详细介绍手机静态IP地址详解及获取方法 一、什么是静态IP地址&#xff1f; 静态IP&#xff1a;由用户手动设置的固定IP地址&#xff0c;不会因网络重启或设备重连而改变。 动态IP&#xff1a;由路…...

NumPy对二维矩阵中的每个元素进行加减乘除和对数运算

使用NumPy对二维矩阵中的每个元素进行加减乘除和对数运算的方法如下&#xff1a; 1. 加减乘除运算 对每个元素进行标量运算&#xff0c;可直接使用算术运算符。 示例代码&#xff1a; import numpy as nparr np.array([[1, 2], [3, 4]])# 加法 result_add arr 5 print(&…...

基于C8051F340单片机的精确定时1S的C程序

一、前言 C8051F340单片的定时器2 是一个 16 位的计数器/定时器&#xff0c;由两个 8 位的 SFR 组成&#xff1a;TMR2L&#xff08;低字节&#xff09;和TMR2H&#xff08;高字节&#xff09;。定时器 2 可以工作在 16 位自动重装载方式、8 位自动重装载方式&#xff08;两个 …...

提升Windows安全的一些措施

由简单到复杂&#xff0c;仅供参考 一、杀毒软件&#xff1a; 1、杀毒能力&#xff1a; https://haokan.hao123.com/v?vid3883775443252827335&pdhaokan_share 2、使用注意&#xff1a; 一台主机只安装一个杀毒软件就可以了 杀毒软件会误报&#xff0c;造成正常文件…...

中科岩创基坑自动化监测解决方案

1.行业现状 城市基坑开挖具有施工风险高、施工难度大等特点。由于地下土体性质、荷载条件、施工环境的复杂性&#xff0c;单根据地质勘察资料和室内土工试验参数来确定设计和施工方案&#xff0c;往往含有许多不确定因素&#xff0c;对在施工过程中引发的土体性状、环境、邻近建…...

Elasticsearch 系列专题 - 第二篇:数据建模与索引管理

在掌握了 Elasticsearch 的基本概念和操作后,本篇将重点介绍如何设计和管理索引,以及如何高效地导入和维护数据。这对于构建一个高效、可扩展的搜索系统至关重要。 1. 索引设计 1.1 如何选择合适的索引结构 索引是 Elasticsearch 的核心,设计时需考虑以下因素: 数据用途:…...

解决缓存穿透的布隆过滤器与布谷鸟过滤器:谁更适合你的应用场景?

目录 一、布隆过滤器&#xff1a;高效的空间节省者 1.1 布隆过滤器是什么&#xff1f; 1.2 工作原理 1.3 优点 1.4 缺点 1.5 适用场景 二、布谷鸟过滤器&#xff1a;解决删除难题的创新者 2.1 布谷鸟过滤器是什么&#xff1f; 2.2 工作原理 2.3 优点 2.4 缺点 2.5 适用场景 三、…...

OpenHarmony子系统开发 - 调测工具(一)

OpenHarmony子系统开发 - 调测工具&#xff08;一&#xff09; 一、bytrace使用指导 简介 bytrace是开发人员用于追踪进程轨迹、分析性能的一种工具&#xff0c;主要对内核ftrace进行了封装和扩展&#xff0c;来支持用户态的打点。通过该工具可以打开想要查看的用户态和内核l…...

Qt中的鼠标事件

1.鼠标进入事件和鼠标离开事件 1.1添加新文件 1.2ui界面 拖出一个Label控件&#xff0c;修改frameShape为Box&#xff0c;使边框更明显 1.3代码实现 #ifndef MYLABEL_H #define MYLABEL_H#include <QLabel>class myLabel : public QLabel {Q_OBJECT public:explicit m…...

MySQL JOIN详解:INNER JOIN与LEFT JOIN的选择与应用

在数据库查询中&#xff0c;JOIN操作是最常用也最重要的操作之一。不同的JOIN类型会导致完全不同的查询结果&#xff0c;正确选择JOIN类型是编写高效、准确SQL查询的关键。本文将深入探讨INNER JOIN和LEFT JOIN的区别、应用场景以及常见问题。 一、JOIN基础概念 1. 什么是JOI…...

Flink 反压下的 TCP 流控制

1. 什么是 Flink 反压和 TCP 流控制&#xff1f; 反压&#xff08;Backpressure&#xff09;是什么&#xff1f; 反压是分布式流处理系统中一种自我调节机制。当下游处理数据的速度跟不上上游发送数据的速度时&#xff0c;反压会让上游放慢发送速度&#xff0c;以避免系统过载…...

山东大学软件学院项目实训开发日志(7)之测试前后端本地部署

基于队长搭建的springbootvue框架&#xff0c;在本地进行测试搭建。 在运行后端过程中&#xff0c;出现下图错误&#xff1a; 查找后发现这个问题出现在 Maven 项目的 pom.xml 文件中&#xff0c;显示找不到一些依赖项。所以在此进行最简单的重新加载项目得以解决&#xff0c;…...

YOLOv11训练中精准率召回率与mAP@0.5的动态变化分析

目标检测模型的训练过程涉及多个关键性能指标和损失函数的变化&#xff0c;这些数据能够直观反映模型的收敛速度、最终精度以及改进效果。本文旨在通过绘制YOLOv11模型在训练过程中的精准率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、mAP0.5 、…...