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

设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析

在这里插入图片描述

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种封装对象创建过程的方式,使得对象的创建与使用分离,从而提高了系统的可扩展性和可维护性。

一、核心思想

工厂模式的核心思想是将“实例化对象”的操作与“使用对象”的操作分开,将实例化对象的责任交给专门的工厂类负责。这样可以降低系统的耦合度,提高系统的可扩展性和可维护性。

二、定义与结构

1、定义

工厂模式稳坐创建型设计模式的头把交椅,其核心使命是匠心独运地架构一种精妙绝伦的机制,使得对象的创建环节与使用环节能够井水不犯河水地分离开来。具体而言,它仰仗一个或多个专业打造的工厂类,依据预设的特定规则、传入的精准参数或者实时监测到的系统条件,英明决断究竟该打造何种类型的对象,并将成品对象精准无误地交付给翘首以盼的代码模块。

2、工厂模式有两种主要形式

2.1、简单工厂模式:不作为设计模式被正式认可,但它是一个常用的概念。它不是严格的设计模式,因为它违反了开闭原则(对扩展开放,对修改关闭)。简单工厂模式包含:

  • 工厂类:负责接收所有创建请求。
  • 产品接口或抽象类:定义产品的公共接口。
  • 具体产品类:实现产品接口的具体产品。

2.2、工厂方法模式:是一种更正式的设计模式,它解决了简单工厂模式的问题,并且遵循开闭原则。它包括:

  • 抽象工厂(Abstract Factory):声明了一个创建产品的接口,其中的工厂方法用于实例化一个产品。通常以抽象类或者接口这般高冷姿态示人,它宛如一位高瞻远瞩的总设计师,定义了一系列用于创建紧密相关的一系列产品对象的抽象方法集。这些抽象方法如同精密模具,为后续衍生出的具体工厂子类勾勒出清晰、统一且规范的创建框架,确保在整个产品家族创建过程中的规范性与一致性得以严格保障。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责实例化具体的产品。作为抽象工厂的忠实拥趸,具体工厂类或是继承自抽象工厂抽象类,或是精准实现其接口。每个具体工厂类都如同一位专注的能工巧匠,与某一种特定类型的产品深度绑定,不离不弃。它负责将抽象工厂中定义的抽象创建方法生动具象化,凭借精湛技艺实实在在地生产出对应的具体产品对象,将抽象的创意构想落地生根。
  • 抽象产品(Abstract Product):定义了产品的接口,具体的产品类将实现这个接口。抽象产品恰似一份精心绘制的蓝图,多以抽象类或接口呈现。它事无巨细地概括了产品所应具备的公共方法、必备属性,为所有跃跃欲试的具体产品类精心规划了前行方向,是判断具体产品是否达标的严苛基准线。
  • 具体产品(Concrete Product):实现了抽象产品接口,是工厂模式所创建的对象。具体产品类则是依据抽象产品所勾勒的蓝图,加班加点精心打造出来的实体杰作。它们或是继承自抽象产品类,或是完美实现其接口,通过夜以继日地实现其中所定义的各种方法,赋予了产品鲜活的生命力,展现出实实在在的功能与特性,以满足千变万化的业务场景需求。

2.3、抽象工厂模式:提供了一组相关或相互依赖的对象的创建接口,而无需指定它们具体的类。这是一种更为复杂的工厂模式,通常用来创建一系列相关的对象。

三、实现步骤及代码示例

以Java为例,展示工厂模式的具体使用。

1、简单工厂模式

// 抽象产品
interface Car {void drive();
}// 具体产品
class BMW implements Car {@Overridepublic void drive() {System.out.println("Driving BMW");}
}class Benz implements Car {@Overridepublic void drive() {System.out.println("Driving Benz");}
}// 工厂类
class CarFactory {public static Car createCar(String type) {if ("BMW".equalsIgnoreCase(type)) {return new BMW();} else if ("Benz".equalsIgnoreCase(type)) {return new Benz();}return null;}
}// 客户端代码
public class Client {public static void main(String[] args) {Car car1 = CarFactory.createCar("BMW");car1.drive();Car car2 = CarFactory.createCar("Benz");car2.drive();}
}

2、工厂方法模式

// 抽象产品
interface Car {void drive();
}// 具体产品
class BMW implements Car {@Overridepublic void drive() {System.out.println("Driving BMW");}
}class Benz implements Car {@Overridepublic void drive() {System.out.println("Driving Benz");}
}// 抽象工厂
interface CarFactory {Car createCar();
}// 具体工厂
class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMW();}
}class BenzFactory implements CarFactory {@Overridepublic Car createCar() {return new Benz();}
}// 客户端代码
public class Client {public static void main(String[] args) {CarFactory bmwFactory = new BMWFactory();Car bmw = bmwFactory.createCar();bmw.drive();CarFactory benzFactory = new BenzFactory();Car benz = benzFactory.createCar();benz.drive();}
}

3、抽象工厂模式

由于抽象工厂模式较为复杂,此处不展开代码示例,但核心思想是提供一个接口,用于创建相关或依赖对象的家族,而不需要指明具体类。

四、常见技术框架应用

1、Spring框架

应用场景:在Spring框架中,工厂模式常用于Bean的创建和管理。Spring容器通过工厂模式来实例化和管理应用程序中的Bean,使得开发者无需手动创建和管理这些对象。

实现方式:Spring容器通过反射机制来调用具体的工厂方法或构造器,创建Bean实例。同时,Spring还支持通过配置文件或注解来指定Bean的创建方式和依赖关系。

2、MyBatis框架

应用场景:MyBatis框架中,SqlSessionFactory是创建SqlSession的工厂类。SqlSession是MyBatis的核心接口,用于执行SQL语句和管理事务。

实现方式:MyBatis通过读取配置文件或注解来构建SqlSessionFactory,然后通过SqlSessionFactory来创建SqlSession实例。这样,开发者无需直接操作数据库连接和SQL语句,提高了代码的可维护性和可扩展性。

3、Java EE/Jakarta EE

应用场景:在Java EE/Jakarta EE中,工厂模式常用于创建和管理企业级应用中的组件和服务。例如,JNDI(Java Naming and Directory Interface)服务通过工厂模式来查找和获取各种资源(如数据库连接、消息队列等)。

实现方式:Java EE/Jakarta EE提供了多种工厂类和接口来支持企业级应用的开发。开发者可以通过这些工厂类和接口来获取所需的服务和资源,而无需关心具体的实现细节。

4、日志框架(如Log4j、SLF4J)

应用场景:日志框架中,工厂模式常用于创建不同类型的日志记录器。根据不同的配置或运行时参数,可以动态地创建和使用不同的日志对象。

实现方式:日志框架通常定义了一个日志接口和多个具体的日志实现类。然后,通过工厂模式来根据配置或参数创建具体的日志记录器实例。这样,开发者可以在不修改代码的情况下灵活地切换日志实现。

5、UI框架(如Swing、JavaFX)

应用场景:在UI框架中,工厂模式常用于创建和管理用户界面组件。通过工厂模式,可以方便地创建和配置各种UI组件,如按钮、文本框、标签等。

实现方式:UI框架通常提供了一组工厂类或方法来创建和管理UI组件。开发者可以通过这些工厂类或方法来创建所需的UI组件,并设置其属性和行为。

以 Spring Boot 框架创建不同数据源连接为例

首先,定义抽象产品:

// 抽象产品:数据源连接
public interface DataSourceConnection {void connect();void close();
}

接着,创建具体产品:

// 具体产品:MySQL 数据源连接
public class MySQLDataSourceConnection implements DataSourceConnection {@Overridepublic void connect() {System.out.println("正在连接 MySQL 数据源...");// 实际连接 MySQL 数据库的代码,此处省略,如加载驱动、配置 URL、用户名、密码等}@Overridepublic void close() {System.out.println("正在关闭 MySQL 数据源连接...");// 关闭连接的代码,此处省略}
}// 具体产品:Oracle 数据源连接
public class OracleDataSourceConnection implements DataSourceConnection {@Overridepublic void connect() {System.out.println("正在连接 Oracle 数据源...");// 实际连接 Oracle 数据库的代码,此处省略,如加载驱动、配置 URL、用户名、密码等}@Overridepublic void close() {System.out.println("正在关闭 Oracle 数据源连接...");// 关闭连接的代码,此处省略}
}

然后,定义抽象工厂:

// 抽象工厂:数据源连接工厂
public abstract class DataSourceConnectionFactory {public abstract DataSourceConnection createConnection();
}

再创建具体工厂:

// 具体工厂:MySQL 数据源连接工厂
public class MySQLDataSourceConnectionFactory extends DataSourceConnectionFactory {@Overridepublic DataSourceConnection createConnection() {return new MySQLDataSourceConnection();}
}// 具体工厂:Oracle 数据源连接工厂
public class OracleDataSourceConnectionFactory extends DataSourceConnectionFactory {@Override
·public DataSourceConnection createConnection() {return new OracleDataSourceConnection();}
}

最后,在 Spring Boot 应用中使用:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class DataSourceConfig {@Beanpublic DataSourceConnectionFactory mySQLDataSourceConnectionFactory() {return new MySQLDataSourceConnectionFactory();}@Beanpublic DataSourceConnectionFactory oracleDataSourceConnectionFactory() {return new OracleDataSourceConnectionFactory();}
}

在其他业务代码中,就可以通过 @Autowired 注解注入工厂类,进而获取相应的数据源连接,例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class DatabaseService {@Autowiredprivate DataSourceConnectionFactory mySQLDataSourceConnectionFactory;public void doSomething() {DataSourceConnection connection = mySQLDataSourceConnectionFactory.createConnection();connection.connect();connection.close();}
}

以 Hibernate 框架为例

在 Hibernate 中,SessionFactory 可看作是抽象工厂,它负责创建 Session(相当于产品)。

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateExample {public static void main(String[] args) {// 创建 SessionFactory,相当于创建抽象工厂SessionFactory sessionFactory = new Configuration().buildSessionFactory();// 从工厂中获取 Session,相当于使用具体工厂创建产品Session session = sessionFactory.openSession();// 使用 Session 进行数据库操作,此处省略具体代码session.close();sessionFactory.close();}
}

这里,Configuration 类中的一些配置方法和内部逻辑就类似于具体工厂的构建过程,最终构建出 SessionFactory,而 SessionFactory 依据配置信息创建出 Session,用于后续的数据库交互操作。

五、应用场景

  1. 复杂对象创建:当对象创建涉及读取复杂配置文件获取关键初始化参数,像创建数据库连接对象时,要依据配置文件中的数据库 URL、用户名、密码精准配置,还要加载特定的数据库驱动程序,工厂模式便能大显身手,将这些复杂且易错的操作统统封装进工厂类中,使得业务代码只需关注如何使用创建好的对象,彻底与复杂的创建过程绝缘。
  2. 多类型对象按需创建:依据用户输入(如图形编辑软件根据用户所选图形类型创建圆形、矩形、三角形等不同图形)、系统状态(如电商系统根据促销活动创建不同折扣的商品对象)、业务规则(如根据不同的会员等级提供不同服务套餐)等条件,工厂模式通过巧妙设计不同的使具体工厂,能够精准无误地根据各种条件创建出对应的对象,满足多样化的业务需求,实现个性化服务。
  3. 对象创建逻辑频繁变动:在电商促销活动期间,需要根据不同的促销规则频繁创建不同折扣的商品对象;又或是在软件系统迭代升级过程中,需要不断调整对象的创建逻辑以适应新的架构要求。此时,工厂模式的优势就淋漓尽致地展现出来了,它能够在工厂类中方便地修改和扩展对象创建逻辑,而不会对使用这些对象的另业务代码造成任何影响,确保了系统的稳定性与可维护性,让代码在变革中依然保持优雅。

六、优缺点

优点

  1. 解耦对象创建与使用:清晰地划分了对象创建和使用的职责边界,极大地降低了代码之间的耦合度。使得使用对象的代码能够独立于对象的创建过程,便于后续的维护与扩展。当需要对对象创建方式进行调整时,只需在工厂类中进行改动,而不会波及到整个代码库,为代码的长期演进提供了保障。
  2. 提高代码复用性:工厂类具有很强的复用性,尤其是在对象创建过程比较复杂的情况下,复用工厂类能够避免在多个地方重复编写繁琐的创建代码。例如,多个模块都需要创建相同类型的数据库连接对象,此时只需复用同一个数据库连接工厂即可,大大提高了开发效率,减少了代码冗余。
  3. 便于代码的维护和扩展:当需要添加新的产品或者修改产品的创建逻辑时,只需要在所在的工厂类和相应的产品类中进行修改,而不会影响到其他使用这些产品的代码。例如,要在图形绘制系统中添加一种新的品类型,只需要创建新的具体产品类和对应的具体工厂类,而不需要修改图形绘制的主程序,使得系统的可扩展性得到了显著提升,能快速适应业务的变化。

优点

  1. 增加代码复杂性:引入工厂模式必然会增加代码的层次结构和类的数量。对于一些简单的应用场景,如果过度使用工厂模式,反而会使代码变得更加复杂,晦涩难懂,增加了开发人员的理解成本和维护难度。原本简单直接的创建过程可能被层层工厂类包裹,让人迷失在代码的迷宫之中。
  2. 工厂类可能会变得复杂:如果工厂需要创建的产品种类过多,或者产品的创建逻辑非常复杂,工厂类本身可能会变得庞大而复杂,不利于代码的维护。例如,一个工厂类需要根据几十种不同的条件来创建不同类型的对象,此时这个工厂类的代码将会非常冗长,难以理清其中的逻辑关系,给后续的维护工作带来巨大挑战,甚至可能成为代码维护的“黑洞”。

工厂模式凭借其独特的设计理念,为对象创建提供了一种高效、灵活且易于维护的解决方案。尽管存在一定的局限性,但在复杂多变的软件开发场景中,只要合理运用,就能充分发挥其优势,助力打造高质量的软件系统。

在这里插入图片描述

相关文章:

设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种封装对象创建过程的方式,使得对象的创建与使用分离,从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…...

ElasticSearch7.10-分词器

文章目录 分词器1.字符过滤器1.介绍2.过滤html标签3.mappings过滤规则(屏蔽非文明用语)4.正则替换 2.自定义分词器1.代码2.查询 3.中文分词器1.下载ik分词器7.10.0版本(跟es对应)2.应用ik分词器1.进入插件目录下创建一个ik目录2.将…...

MLP、CNN、Transformer 的区别解析

亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

Android Camera压力测试工具

背景描述: 随着系统的复杂化和业务的积累,日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化,需要对Android Camera应用进行全面的压测。 对于压…...

[Qt] 常用控件 | QWidget | “表白程序2.0”

目录 一、控件概述 控件体系的发展阶段: 二、QWidget 核心属性 核心属性概览: 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 &#xf…...

word无法插入svg格式图片

插入后出现这样的窗口,表明word版本低,没有svg这个选项。 因此这就是区别。在b站找升级word视频。...

【UE5 C++课程系列笔记】20——共享指针的简单使用

目录 概念 创建共享指针示例 重设共享指针 共享指针内容转移 概念 共享指针(主要以 TSharedPtr 为例),TSharedPtr 基于引用计数机制来工作,旨在解决对象所有权共享以及确保在合适的时候自动释放对象资源的问题。它允许多个 TS…...

Oracle 数据库 dmp文件从高版本导入低版本的问题处理

当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…...

Tomcat优化指南

以下是一份详细的Tomcat优化指南: 一、JVM(Java虚拟机)优化 内存设置 堆内存(Heap Memory) 调整-Xms(初始堆大小)和-Xmx(最大堆大小)参数。一般来说,将初始…...

本地调试自定义Maven Plugin步骤

添加自定义插件到dependencies 找到对应依赖的类,打上断点。 debug运行插件。...

css实现文字描边

效果 学习啦 -webkit-text-stroke-width: 设置文本描边的宽度,值可以是任何长度单位(如 px, em, rem 等) -webkit-text-stroke-color:设置文本描边的颜色,值可以是任何颜色值(如 red, green, bl…...

B2B营销的新篇章:开源AI智能名片S2B2C商城小程序的应用探索

摘要: B2B营销,作为企业间营销活动的总称,因其独特的业务特性而呈现出不同于B2C营销的显著特征。在数字化转型的大潮中,B2B企业正积极探索新的营销手段以提高效率和竞争力。本文旨在探讨B2B营销的基本特性,并重点引入…...

坐标系统转换方法研究与实现

坐标系统转换方法研究与实现 摘要:坐标系统是测量工作中定位的基础,坐标系统有很多形式和基准,不同历史时期所建立和使用的坐标系是不同的。随着科学技术的进步,测量方法和观测技术不断改进,采用的参考椭球及定位方式也逐步完善和精化。为更加精确的确定点位信息并综合利…...

naive ui 使用地址记录

naive ui 地址Naive UI Naive UI 是一个 Vue3 的组件库。 要了解如何安装,参见安装。 它比较完整,主题可调,用 TypeScript 写的,快...

std__invoke 的使用

std__invoke 的使用 文章目录 std__invoke 的使用1. std::invoke 的功能2. 语法3. 使用场景1. 调用普通函数2. 调用成员函数3. 调用成员函数(通过指针或引用)4. 调用函数对象(仿函数)5. 调用 Lambda 表达式 4. std::invoke 的优势…...

【Vue】深入理解v-model指令-父子组件数据绑定

一、什么是v-model? v-model是Vue.js中的一个指令,用于在表单元素上实现数据的双向绑定。简单来说,v-model可以让我们轻松地读取和更新数据,无需手动操作DOM。 二、标签选择器组件分析 我们先来看一下子组件的代码:…...

html+css+js网页设计 美食 六角西餐厅美食3个页面

htmlcssjs网页设计 美食 六角西餐厅美食3个页面 (带js) 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取…...

ubuntu 常见问题(持续记录)

1 ubuntu server 22.04 设置静态 IP ubuntu server 在重启之后,IP 会变化,这很不利于作内网穿透,因此很有必要使用静态 IP。 登录进系统之后: cd /etc/netplan/ ls # 我这里是 50-cloud-init.yamlifconfig # 查看网卡接口&…...

网络安全 | 物联网安全:从设备到网络的全方位防护

网络安全 | 物联网安全:从设备到网络的全方位防护 一、前言二、物联网设备安全2.1 物联网设备的特点与安全风险2.2 物联网设备安全防护策略 三、物联网网络通信安全3.1 物联网网络通信的安全挑战3.2 物联网网络通信安全防护措施 四、物联网数据安全4.1 物联网数据的…...

浅谈torch.utils.data.TensorDataset和torch.utils.data.DataLoader

1.torch.utils.data.TensorDataset 功能定位 torch.utils.data.TensorDataset 是一个将多个张量(Tensor)数据进行简单包装整合的数据集类,它主要的作用是将相关联的数据(比如特征数据和对应的标签数据等)组合在一起&…...

大模型 LangChain 开发框架-初探

大模型 LangChain 开发框架-初探 一、LangChain 概述 LangChain 是一个强大的由大型语言模型(LLM)驱动的应用程序开发框架。它的核心价值在于提供了标准化组件接口、高效的任务编排能力以及可观察性和评估机制。通过这些特性,LangChain 有效…...

MySQL 窗口函数

MySQL 窗口函数 1,窗口函数 1.1,什么是窗口函数1.2,基本语法 2,函数详解 2.1,聚合函数2.2,排序函数2.3,偏移函数2.4,值函数 3,进阶用法 1,窗口函数 1.1&am…...

【大模型系列】MultiUI(2024.11)

Paper:https://arxiv.org/pdf/2410.13824Github:https://neulab.github.io/MultiUI/Author:Junpeng Liu et al., 卡内基梅隆 核心1: 先基于text-based LLMs获取网页的accessibility tree(辅助功能树,https://200t.w3c…...

学习笔记079——数据结构之【树】

文章目录 1、重点概念1.1、结点概念1.2、树节点声明 2、树2.1、定义2.2、结点的度2.3、结点关系2.4、结点层次2.5、树的深度 3、二叉树3.1、定义3.2、二叉树特点3.3、二叉树性质3.4、斜树3.5、满二叉树3.6、完全二叉树3.7、二叉树的存储结构3.7.1、顺序存储3.7.2、二叉链表 3.8…...

CPT203 Software Engineering 软件工程 Pt.3 系统建模(中英双语)

文章目录 5. System Modeling(系统建模)5.1 Context models(上下文模型)5.2 Interaction models(交互模型)5.2.1 Use case modeling(用况建模)5.2.2 Sequence diagram(顺…...

vue使用vue-seamless-scroll进行轮播滚动展示内容

我这里只是记录下一些基本的东西,具体大家可以查看官网介绍,有更详细的使用文档(目前有vue和js版本): https://chenxuan0000.github.io/vue-seamless-scroll/zh/ 安装组件: npm install vue-seamless-scro…...

python入门

目录 一、Python的诞生 二、Python的特点 三、Python环境的搭建 1.搭建运行环境 2.搭建开发环境 一、Python的诞生 如果大家在上大学之前有接触过一些关于编程的课程,Python绝对是最早接触的语言之一。 在学习任何一门编程语言之前,都需要了解它的…...

深度解析 Python 网络框架:Django、Tornado、Flask 和 Twisted

目录 引言Python 网络框架概述Django:全栈开发的首选框架 3.1 Django 的核心特性3.2 Django 的应用场景3.3 优势与不足 Tornado:高性能的异步框架 4.1 Tornado 的异步特性4.2 Tornado 的应用场景4.3 优势与不足 Flask:轻量级的微框架 5.1 Fl…...

摆脱Zotero存储限制:WebDAV结合内网穿透打造个人文献管理云平台

文章目录 前言一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 前言 如果你是科研工作者、学生或者任何需要频繁处理大量学术资料的人士,你一定对如何高效管理和引用文献感到头…...

Unity 对Sprite或者UI使用模板测试扣洞

新建两个材质球: 选择如下材质 设置如下参数: 扣洞图片或者扣洞UI的材质球 Sprite或者UI的材质球 新建一个单独Hole的canvas,将SortOrder设置为0,并将原UI的canvans的SortOrder设置为1 对2DSprite则需要调整下方的参数 hole的O…...

Wend看源码-Java-Arrays 工具集学习

摘要 java.util.Arrays 是 Java 标准库中的一个实用工具类,它提供了各种静态方法来操作数组,包括排序、搜索、比较、填充等。这些方法简化了对数组的操作,并且在很多情况下可以提高代码的可读性和效率。以下是关于Arrays类中提供的一些主要方…...

【算法复健】0102 快速选择算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、算法引入1. 冒泡排序2.快速排序3. 快速选择(1)题目:数组中的第K个最大元素(2)代码 前言 本文由快速排序算法引入快速选…...

【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?

今天在开发一个HarmonyOS NEXT的应用的时候,发现http接口如果返回的状态码是424时,我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现: 我的拦截器代码如下: 解决办法: 先说解决办法&#xff…...

口语笔记——使动词

每个使动词都可以有三种形式,以move为例: move作为动词可表达:使……感动,让……感动,通常用于主谓宾结构。ed作为形容词可表达:感动的,通常用于主系表结构。ing作为形容词可表达:令…...

SQL-leetcode-196. 删除重复的电子邮箱

196. 删除重复的电子邮箱 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解…...

汇编语言:从键盘输入数字字符,(计算阶乘),以无符号十进制形式输出(分支、循环程序)

1.分支结构原理 分支结构是汇编语言中的一种基本控制结构,它允许程序根据条件选择执行不同的路径。分支结构通常通过跳转(jump)指令来实现。 条件判断: 汇编语言中的条件判断通常通过比较(compare)指令来实…...

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型损坏: 前挡风玻璃(damage-front-windscreen ) 损坏的门 (damaged-d…...

python的urllib模块和http模块

1.python的urllib库用于操作网页,并对网页内容进行处理 urllib包有如下模块: urllib.request:打开和读取URL urllib.error: 包含urllib.request抛出的异常 urllib.parse: 解析URL urllib.robotparser&#xff1…...

Codigger集成Copilot:智能编程助手

在信息技术的快速发展中,编程效率和创新能力的提升成为了开发者们追求的目标。Codigger平台通过集成Copilot智能编程助手,为开发者提供了一个强大的工具,以增强其生产力、创新力和技能水平。本文将深入探讨Codigger与Copilot的集成如何为IT专…...

快递物流查询API接口推荐

针对快递物流查询API接口及行政区划解析的需求,以下是一些推荐和解析: ### 一、快递物流查询API接口推荐 1. **ShowAPI** * **功能**:支持国内外1500快递物流公司的物流跟踪服务,包括顺丰、圆通、申通、中通、韵达等主流快递公司…...

【Unity3D】3D渲染流水线总结

3D渲染流水线: CPU阶段(应用阶段): 1、加载数据:硬盘->内存->显存 场景数据从硬盘HDD加载到内存RAM,网格和纹理等数据会再次加载到显存VRAM,显卡对显存访问速度更快。 2、设置渲染状态…...

LevelDB 源码阅读:利用 Clang 的静态线程安全分析

LevelDB 中有一些宏比较有意思,平时自己写代码的时候,还基本没用过。这些宏在 thread_annotations.h 中定义,可以在编译时使用 Clang 编译器的线程安全分析工具,来检测潜在的线程安全问题。 比如下面这些宏,到底有什么…...

不只是工具:ChatGPT写作在学术中的创新思维与深度思考

目录 1.数据选择与质量 2.Prompt技巧 1.明确任务 2.上下文信息 3.好的示例 3.后期编辑与润色 随着AIGC技术的迅猛发展和不断升级,AI写作正逐渐成为各行各业的新宠。然而不少宝子们们却发现了一个有趣的现象:虽然都是依赖AI生成文本,有些…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)(八continue语句和break语句)

在C中,continue语句和break语句都是用于控制循环的执行流程的关键字,但它们有不同的用途和行为。 1、break语句用于立即终止当前所在的循环或switch语句,并跳出循环体,继续执行循环之后的代码,break语句用于直接跳出循…...

sql server 动态执行sql

实例&#xff1a; execute sp_executesql Nselect count(1) FROM table X2 WITH(NOLOCK) WHERE X2.UPDDTTM > DT_START AND X2.UPDDTTM < DT_END , NDT_START datetime,DT_END datetime, DT_START2025-01-02 10:06:58.620,DT_END2025-01-02 10:09:35.457 参考&…...

【数据结构Ⅰ复习题】

如有错误欢迎指正&#xff0c;题目根据教材----------严蔚敏数据结构&#xff08;c语言版 第2版&#xff09;人民邮电电子版 数据结构Ⅰ复习题 一、填空题1&#xff0e;算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2&#xff0e;非空单链表L中*p是头…...

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷&#xff0c;但除了将数据从索尼传输到Android之外。众所周知&#xff0c;旧的索尼手机上存储着大量的文件&#xff0c;因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题&#xff0c;我们做…...

服务器端请求伪造之基本介绍

一.服务器端请求伪造漏洞基础 1.客户端请求 客户端请求指的是由客户端设备&#xff08;如个人计算机、智能手机、平板电脑等&#xff09;或软件&#xff08;浏览器、各种APP&#xff09;发出的请求&#xff0c;以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输…...

Java反射详解(三)

上一篇博客&#xff1a;Java反射详解&#xff08;二&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.c…...

HTML——59. maxlength和disabled属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>maxlength和disabled属性</title></head><body><!--input元素的type属性&#xff1a;(必须要有)1.指定输入内容的类型2.默认为text,单行文本框--> …...