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

【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD
🔥 2025本人正在沉淀中… 博客更新速度++
👍 欢迎点赞、收藏、关注,跟上我的更新节奏
🎵 当你的天空突然下了大雨,那是我在为你炸乌云

文章目录

  • 一、入门
    • 什么是抽象工厂模式?
    • 为什么要抽象工厂模式?
    • 如何实现抽象工厂模式?
    • 抽象工厂模式和工厂方法的区别
  • 二、抽象工厂模式在框架源码中的运用
    • JDBC 中的 java.sql.Connection
    • Spring 框架中的 BeanFactory
  • 三、总结
    • 抽象工厂模式的优点
    • 抽象工厂模式的缺点
    • 抽象工厂模式的适用场景

一、入门

什么是抽象工厂模式?

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。
简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相关的对象,而工厂方法模式只能创建一种对象。

为什么要抽象工厂模式?

假设你要购买一套家具(沙发、茶几、电视柜),并且希望这些家具的风格保持一致(比如现代风格或古典风格)。如果没有抽象工厂模式,下面是没有抽象工厂的实现:

// 现代风格沙发
class ModernSofa {public void lieOn() {System.out.println("躺在现代风格沙发上");}
}// 古典风格沙发
class ClassicSofa {public void lieOn() {System.out.println("躺在古典风格沙发上");}
}// 现代风格茶几
class ModernCoffeeTable {public void putOn() {System.out.println("在现代风格茶几上放东西");}
}// 古典风格茶几
class ClassicCoffeeTable {public void putOn() {System.out.println("在古典风格茶几上放东西");}
}// 客户端代码
public class FurnitureShop {public static void main(String[] args) {// 选择现代风格ModernSofa modernSofa = new ModernSofa();ModernCoffeeTable modernCoffeeTable = new ModernCoffeeTable();modernSofa.lieOn();modernCoffeeTable.putOn();// 选择古典风格ClassicSofa classicSofa = new ClassicSofa();ClassicCoffeeTable classicCoffeeTable = new ClassicCoffeeTable();classicSofa.lieOn();classicCoffeeTable.putOn();}
}

存在问题

  1. 风格一致性难以保证
    • 如果客户端代码不小心混用了不同风格的对象(比如现代风格沙发 + 古典风格茶几),会导致风格不一致。
ModernSofa sofa = new ModernSofa();
ClassicCoffeeTable table = new ClassicCoffeeTable(); // 风格不一致!
  1. 代码重复
    • 每次创建一组家具时,都需要重复编写类似的代码。
      ModernSofa sofa = new ModernSofa();
      ModernCoffeeTable table = new ModernCoffeeTable();
    • 如果家具种类增多(比如增加电视柜、餐桌),代码会变得更加冗长。
  2. 难以扩展
    • 如果新增一种风格(比如北欧风格),需要修改客户端代码,手动创建新的对象:
      NordicSofa sofa = new NordicSofa();
      NordicCoffeeTable table = new NordicCoffeeTable();
    • 这会违反开闭原则(对扩展开放,对修改关闭)。
  3. 客户端代码与具体类耦合
    • 客户端代码直接依赖具体的家具类(如ModernSofaClassicCoffeeTable),如果具体类发生变化(比如类名修改),客户端代码也需要跟着修改。

如何实现抽象工厂模式?

  1. 抽象工厂(Abstract Factory):声明一组创建产品对象的方法,每个方法对应一种产品。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建具体的产品对象。
  3. 抽象产品(Abstract Product):声明产品的接口。
  4. 具体产品(Concrete Product):实现抽象产品接口,定义具体产品的行为。

【案例】家具城 - 改
在这里插入图片描述
抽象产品(Abstract Product):沙发、茶几。

// 沙发
interface Sofa {void lieOn();
}// 茶几
interface CoffeeTable {void putOn();
}

具体产品(Concrete Product): 现代沙发、古典风格沙发、现代风格茶几、古典风格茶几。

// 具体产品:现代风格沙发
class ModernSofa implements Sofa {public void lieOn() {System.out.println("躺在现代风格沙发上");}
}// 具体产品:古典风格沙发
class ClassicSofa implements Sofa {public void lieOn() {System.out.println("躺在古典风格沙发上");}
}// 具体产品:现代风格茶几
class ModernCoffeeTable implements CoffeeTable {public void putOn() {System.out.println("在现代风格茶几上放东西");}
}// 具体产品:古典风格茶几
class ClassicCoffeeTable implements CoffeeTable {public void putOn() {System.out.println("在古典风格茶几上放东西");}
}

抽象工厂(Abstract Factory): 家具工厂

interface FurnitureFactory {Sofa createSofa();CoffeeTable createCoffeeTable();
}

具体工厂(Concrete Factory):现代风格家具工厂、古典风格家具工厂。

// 具体工厂:现代风格家具工厂
class ModernFurnitureFactory implements FurnitureFactory {public Sofa createSofa() {return new ModernSofa();}public CoffeeTable createCoffeeTable() {return new ModernCoffeeTable();}
}// 具体工厂:古典风格家具工厂
class ClassicFurnitureFactory implements FurnitureFactory {public Sofa createSofa() {return new ClassicSofa();}public CoffeeTable createCoffeeTable() {return new ClassicCoffeeTable();}
}

客户端

public class FurnitureShop {private Sofa sofa;private CoffeeTable coffeeTable;public FurnitureShop(FurnitureFactory factory) {sofa = factory.createSofa();coffeeTable = factory.createCoffeeTable();}public void useFurniture() {sofa.lieOn();coffeeTable.putOn();}public static void main(String[] args) {// 选择现代风格家具工厂FurnitureFactory modernFactory = new ModernFurnitureFactory();FurnitureShop shop = new FurnitureShop(modernFactory);shop.useFurniture();// 选择古典风格家具工厂FurnitureFactory classicFactory = new ClassicFurnitureFactory();shop = new FurnitureShop(classicFactory);shop.useFurniture();}
}

抽象工厂模式和工厂方法的区别

场景工厂方法模式抽象工厂模式
创建目标单个产品(如沙发)一组相关产品(如沙发、茶几、电视柜)
风格一致性无法保证保证一组对象的风格一致
类的数量每个产品需要一个工厂接口和具体工厂类每个产品家族需要一个具体工厂类
客户端代码复杂度需要分别调用多个工厂只需调用一个工厂即可创建一组对象
适用场景单一产品的创建一组相关或依赖对象的创建

二、抽象工厂模式在框架源码中的运用

JDBC 中的 java.sql.Connection

JDBC(Java Database Connectivity)是Java中用于操作数据库的标准API,其中的 ConnectionStatement 等接口也体现了抽象工厂模式。

public class JDBCExample {public static void main(String[] args) throws Exception {// 获取数据库连接(抽象工厂)Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");// 创建Statement(具体产品)Statement statement = connection.createStatement();// 执行查询ResultSet resultSet = statement.executeQuery("SELECT * FROM users");// 处理结果while (resultSet.next()) {System.out.println(resultSet.getString("username"));}}
}

抽象工厂模式的应用

  • 抽象工厂Connection 是一个抽象工厂,定义了创建 StatementPreparedStatement等方法。
  • 具体工厂:不同的数据库驱动(如MySQL、Oracle)提供了具体的 Connection 实现。
  • 产品家族StatementPreparedStatementResultSet 是相关的产品,用于执行SQL语句和处理结果。

Spring 框架中的 BeanFactory

Spring 框架的核心容器 BeanFactory 也是一个典型的抽象工厂模式应用。

public class SpringExample {public static void main(String[] args) {// 加载Spring配置文件BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));// 获取Bean(具体产品)MyService myService = (MyService) factory.getBean("myService");myService.execute();}
}

抽象工厂模式的应用

  • 抽象工厂BeanFactory 是一个抽象工厂,定义了获取Bean的方法(如getBean)。
  • 具体工厂XmlBeanFactory 是一个具体工厂,负责从XML配置文件中创建和管理Bean。
  • 产品家族:Spring容器管理的Bean(如 MyService)是相关的产品,它们可能相互依赖或协作。

三、总结

抽象工厂模式的优点

  1. 保证产品家族的一致性
    • 抽象工厂模式确保创建的对象是同一家族的,比如现代风格的沙发、茶几、电视柜,避免了风格不一致的问题。
  2. 解耦客户端代码
    • 客户端代码只依赖于抽象工厂和抽象产品接口,不依赖于具体的实现类,符合依赖倒置原则。
  3. 符合开闭原则
    • 新增产品家族(如新增北欧风格家具)时,只需增加新的具体工厂类,不需要修改现有代码。
  4. 简化客户端代码
    • 客户端不需要关心具体对象的创建细节,只需要调用工厂方法即可。
  5. 提高代码可维护性
    • 将对象的创建逻辑集中到工厂中,便于统一管理和维护。

抽象工厂模式的缺点

  1. 类的数量增加
    • 每增加一个产品家族,就需要增加一组具体工厂类和具体产品类,可能导致类的数量爆炸。
  2. 扩展产品类型困难
    • 如果需要在现有产品家族中新增产品类型(比如在家具家族中新增“餐桌”),需要修改抽象工厂接口及其所有具体工厂类,违反了开闭原则。
  3. 复杂性增加
    • 对于简单的对象创建场景,使用抽象工厂模式可能会引入不必要的复杂性。
  4. 理解难度较高
    • 抽象工厂模式涉及多个抽象层(抽象工厂、抽象产品、具体工厂、具体产品),初学者可能难以理解。

抽象工厂模式的适用场景

抽象工厂模式适用于以下场景:

  1. 需要创建一组相关或依赖的对象:
    • 比如跨平台的UI组件(Windows按钮、Mac按钮)、家具家族(现代风格沙发、茶几)、数据库访问对象(ConnectionStatement)等。
  2. 需要保证产品家族的一致性:
    • 比如确保所有UI组件都是同一风格,或者所有家具都是同一主题。
  3. 系统需要独立于产品的创建、组合和表示:
    • 比如框架或库的设计,希望将对象的创建逻辑与使用逻辑分离。
  4. 需要支持多种产品家族:
    • 比如支持多种数据库(MySQL、Oracle)、多种操作系统(Windows、Mac)、多种主题(现代、古典)等。
  5. 希望通过配置或依赖注入动态切换产品家族:
    • 比如Spring框架中通过配置文件切换具体的Bean实现。

相关文章:

【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...

Embedding模型介绍部署部署

概述 是一种将高维数据(如‌文本、图像、音频)映射到低维空间的技术,其中每个数据点由实数构成的向量表示,这些向量在向量空间中的位置反映了数据的语义特征。这种技术广泛应用于‌自然语言处理和‌机器学习中,使得计…...

web网络安全:跨站脚本攻击(XSS)

跨站脚本攻击(XSS)概述 跨站脚本攻击(XSS,Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过向受信任的网站注入恶意脚本(通常是 JavaScript),诱使其他用户在…...

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...

Kafka中commitAsync的使用与实例解析

在使用Apache Kafka进行消息处理时,正确管理偏移量(offset)是确保数据一致性和可靠性的重要环节。Kafka提供了多种方式来提交偏移量,其中commitAsync()方法是一种高效且灵活的选择。本文将通过一个完整的实例,详细介绍…...

上海餐饮冷藏配送全方案 一站式服务助企提速发展

在上海这座国际化大都市中,餐饮行业以其繁荣与多元著称。消费者对食品安全和品质要求的日益提高,餐饮冷链运输成为了保障餐饮供应链稳定、高效的关键环节。近日,华鼎冷链科技凭借其创新的一站式服务方案,在上海餐饮冷链领域脱颖而…...

基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频

本系统包含用户、管理员两个角色。 用户角色:注册登录、查看首页电影信息推荐、查看电影详情并进行收藏预定、查看电影资讯、在线客服、管理个人订单等。 管理员角色:登录后台、管理电影类型、管理放映厅信息、管理电影信息、管理用户信息、管理订单等。…...

Java 面试笔记 - Java基础

1 、JDK、JRE 和 JVM 是 Java 开发与运行环境中的三个核心组件,它们之间的关系和区别如下: 1. JDK (Java Development Kit) 定义:JDK 是 Java 开发工具包,包含了开发 Java 应用程序所需的所有工具和库。包含内容: 编…...

基于MFC实现的键盘电子乐器演奏程序

基于MFC实现的键盘电子乐器演奏程序设计 1.项目简介 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文件模拟钢琴声。 请在 release 处下载编译好的 exe 文件运行,如需计…...

支持批量导出的软件,效率拉满!

今天给大家分享一款超实用的软件,它能帮你批量导出PPT里的图片,简直是提升工作效率的神器! PPT转jpg PPT逐页导出为图片 这款软件超级简单易用,打开就能直接上手,不需要复杂的设置。 这个软件有三种功能, …...

AI前端开发:职业晋升的加速器

在数字经济时代,前端开发领域正在经历一场由人工智能 (AI) 技术驱动的深刻变革。掌握AI技能,已不再是锦上添花,而是成为前端工程师职业晋升的关键竞争力。本文将探讨AI写代码工具等AI技术如何重塑前端开发职业路径,以及如何通过学…...

在mfc中使用自定义三维向量类和计算多个三维向量的平均值

先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…...

RK3588配置成为路由器

文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口,一个无线网卡。我需要配置为家用路由器模…...

力扣-回溯-40 组合总和Ⅱ

思路 需要实现树枝层面的去重,利用use数组来判别,如果前一个节点已经使用了,说明这是在往深处遍历了,允许重复,如果前一个节点没有使用且值相同的话,说明是在树枝上重复了 代码 class Solution { public…...

深入理解 Rust 中的 `Box<T>`:堆上的数据与递归类型

1. Box<T> 的基础知识 1.1 堆与栈的分工 在默认情况下&#xff0c;Rust 会将变量存储在栈上。然而&#xff0c;栈的空间有限&#xff0c;且对于大小未知或极大的数据来说&#xff0c;栈并不适用。使用 Box<T>&#xff0c;我们可以将数据存放在堆上&#xff0c;而…...

js原型和原型链,到底咋回事?

js原型和原型链&#xff0c;到底咋回事&#xff1f; js原型的原理 在 JavaScript 里&#xff0c;每个对象都有一个“隐藏的小伙伴”&#xff0c;这个“小伙伴”就是原型。可以把原型想象成一个模板或者一个仓库&#xff0c;对象能从它这个“小伙伴”那里借用一些属性和方法。…...

深入理解IP地址与端口:网络通信的基石

深入理解IP地址与端口&#xff1a;网络通信的基石 文章大纲 网络通信基础概念 1.1 什么是网络通信1.2 OSI模型与TCP/IP模型1.3 数据包传输原理 IP地址深度解析 2.1 IP地址定义与作用2.2 IPv4与IPv6对比2.3 子网划分与CIDR表示法2.4 公网IP与私网IP2.5 特殊IP地址详解 端口机…...

ubuntu系统本地部署deepseek

1、安装ollama 用Ollama部署deepseek模型&#xff0c;官网地址&#xff1a;https://ollama.com/download 根据官网给出的命令直接安装&#xff08;安装linux版本&#xff09; curl -fsSL https://ollama.com/install.sh | sh2、安装deepseek-r1模型 我这里用了8b&#xff0c…...

nginx ngx_http_module(10) 指令详解

nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module&#xff1a;HTTP/2支持模块&#xff0c;允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化&#xff0c;如多路复用、头部压缩和服务器推…...

rman 备份恢复1

前提&#xff1a; rman用户必须具有sysdba权限 使用常用连接方式如下&#xff1a; rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一个rman连接会产生两个进程&#xff0c;action字段为空的就是rman的监控进程&#xff0c;另…...

BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景

在数据爬取中&#xff0c;BeautifulSoup、lxml/XPath和正则表达式的适用场景各有侧重&#xff0c;具体选择需根据数据特征和需求权衡&#xff1a; 1. BeautifulSoup&#xff08;结合CSS选择器&#xff09; 适用场景 简单结构页面&#xff1a;标签层级清晰、属性固定的HTML页面…...

Python装饰器本质250220

定义一个函数&#xff0c;在不修改这个函数的代码的情况下&#xff0c;让函数执行前后会有新的内容加入 def func():print("func")return def outer():def inner():print("new code before")func()print("new code after")returnreturn inner f…...

实时、分时、半实时半分时操作系统

在操作系统中&#xff0c;实时、分时、半实时半分时是三种不同的调度策略&#xff0c;它们决定了系统如何分配和管理CPU资源。以下是它们的定义和举例&#xff1a; 1. 实时操作系统&#xff08;RTOS, Real-Time Operating System&#xff09; 定义&#xff1a;实时操作系统是…...

玩转Docker | 使用Docker部署本地自托管reference速查表工具

玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...

基于springboot校园健康系统的设计与实现(源码+文档)

大家好我是风歌&#xff0c;今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限&#xff0c;通…...

孤独症项目(1)

年也过了&#xff0c;也不能一直玩&#xff0c;该学习还是要学习。 过年前我算是把环境配置好&#xff0c;然后把项目跑起来了&#xff0c;现在的问题是我看不懂这个代码什么意思 代码还是要一行一行看&#xff0c;每一行都看懂了&#xff0c;全文自然就知道了 1 from pathlib…...

DeepSeek 冲击(含本地化部署实践)

DeepSeek无疑是春节档最火爆的话题&#xff0c;上线不足一月&#xff0c;其全球累计下载量已达4000万&#xff0c;反超ChatGPT成为全球增长最快的AI应用&#xff0c;并且完全开源。那么究竟DeepSeek有什么魔力&#xff0c;能够让大家趋之若鹜&#xff0c;他又将怎样改变世界AI格…...

《被讨厌的勇气》(七)

1.共同体感觉是幸福的人际关系的最重要的指标。 2.把对自己的执著变成对他人的关心。 3.不能进行“课题分离”、一味拘泥于认可欲求的人也是及其以自我为中心的人。 4.一味在意“他人怎么看”的生活方式正式只关心“我”的自我中心式的生活方式。 5.别人并不是为了满足你的期待…...

【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用

在日常办公和学习中&#xff0c;将Word文档转换为PDF格式的需求非常普遍。无论是制作简历、撰写报告还是分享文件&#xff0c;都需要确保文档格式在不同设备上保持一致。而小白工具的“Word转PDF”功能正是为此需求量身打造的一款高效解决方案。 【Word转PDF】在线Doc/Docx转换…...

SpringCloud面试题----eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别

dEureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们的区别主要体现在以下几个方面: 设计理念 Eureka:是基于 RESTful 风格设计的,强调简单、轻量级,旨在为微服务架构提供一种易于使用的服务发现解决方案,注重服务的可用性和灵活性。Zookeeper:最初是为分布式协…...

Matplotlib中strpdate2num()函数报错的解决方法

在Matplotlib绘图时&#xff0c;有时会从文件中读取形如“2025/2/20”格式的日期数据&#xff0c;在读取了日期数据后&#xff0c;会通过Matplotlib.dates.strpdate2num()函数将日期格式变为浮点数进行绘制。 1 matplotlib.dates不再支持strpdate2num()函数 使用matplotlib.d…...

easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题

需求背景&#xff1a;有一个需求要做下拉框的值有100多条&#xff0c;同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出&#xff0c;会出现下拉框的值过多&#xff0c;导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本&#xff1a;<depende…...

Java链表全解析:从单向链表到双向链表的实现与优化

一、链表的核心特性 链表是一种通过 节点 存储数据的线性数据结构,每个节点包含 数据域 和 指针域。节点在内存中 不连续存储,通过指针串联。 1.单向链表 2.双向链表 3.环形链表 环形单链表 环形双链表 4.链表的类型 类型结构描述典型应用场景单向链表每个节点只有 一个指…...

《动手学机器人学》笔记

目录 0.介绍1.概述&#xff5c;空间位置、姿态的描述&#xff08;33&#xff09;&#xff5c;《动手学机器人学》2.&#xff08;2&#xff09;-Robotics Toolbox①&#xff08;V10.4&#xff09;3.齐次坐标与变换矩阵4.一般形式的旋转变换矩阵5.&#xff08;轴角法&#xff09;…...

【小游戏】C++控制台版本俄罗斯轮盘赌

制作团队&#xff1a;洛谷813622&#xff08;Igallta&#xff09; 989571&#xff08;_ayaka_&#xff09; Mod&#xff1a;_ayaka_ 双人模式&#xff1a;Igallta 公告&#xff1a; 原先的9.8改名为 Alpha 1.0&#xff0c;以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…...

最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb;群里有同学是做影视赛道的博主&#xff0c;听说最近DeepSeek这么火&#xff0c;咨询能不能用DeepSeek写影评&#xff0c;并整理电影数据资料&#xff0c;自动发布到飞书文档&#xff0c;把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...

Java集合框架之ArrayList解析

目录 一、ArrayList概述 二、优缺点分析 三、底层数据结构 四、源码分析ArrayList初始化容量 五、源码分析ArrayList扩容策略 六、ArrayList集合源码分析 1. 属性分析 2. 构造方法分析 无参构造方法 指定初始容量的构造方法 传入集合的构造方法 3. 添加元素 add(E…...

idea 2023.3.7常用插件

idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl&#xff1b;”&#xff0c;键入一个字符&#xff0c;然后在Ace …...

IM聊天系统架构实现

一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制&#xff1b; 1、重连机制&#xff08;服务端下线&#xff09; 服务端下线&#xff0c;客户端netty可以感知到&#xff0c;在感知的方法中进行重连的操作&#xff0c;注意重连可能连接到旧的服务器继续报错&…...

vue3可选链操作符(?.)

一、定义&#xff1a; 可选链操作符&#xff08;?.&#xff09;是 JavaScript 中的一个语法&#xff0c;用于安全地访问对象的属性&#xff0c;即使该对象为 null 或 undefined&#xff0c;也不会抛出错误&#xff0c;而是返回 undefined。 1、不使用可选链操作符&#xff1…...

科普:Docker run的相关事项

一、镜像名&#xff08;含标签&#xff09;太长 如&#xff0c;通过如下命令行&#xff1a; docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名&#xff08;及标签&#xff09;太长&#xff0c;可以通过改名的方法变短。 在 Docker 中&…...

petalinux高版本设置自动登录和开机自启动配置

petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…...

算法刷题-哈希表的总结

什么时候用数组、什么时候用map呢&#xff1f; 经常会混淆。 混淆1&#xff1a;例如有时候题目可能要求在一大堆元素里找目标元素&#xff0c;要求不能利用用过的字母&#xff0c;这就会让我想到只包含一个键值的set或者是map&#xff0c;但实际上忽略了字母&#xff08;限定大…...

如何通过 Homebrew 安装 Qt 并配置环境变量

如何通过 Homebrew 安装 Qt 并配置环境变量 Qt 是一个跨平台的应用程序开发框架&#xff0c;广泛用于开发图形界面应用。本文将详细介绍如何在 macOS 上通过 Homebrew 安装 Qt 并配置环境变量&#xff0c;以便在终端和 Qt Creator 中使用 Qt 工具。 步骤 1&#xff1a;安装 Ho…...

RESTful 的特点与普通 Web API 的区别

RESTful 是一种设计风格&#xff0c;而不仅仅是普通的 Web API。它遵循一些特定的原则和约束&#xff0c;使得 API 更加简洁、可扩展和易于理解。以下是 RESTful 的特点&#xff0c;以及与普通 Web API 的区别&#xff1a; RESTful 的特点 1. 资源导向 RESTful API 的核心是资…...

Java和JavaScript当中的json对象和json字符串分别讲解

Java和JavaScript当中的json对象和json字符串分别讲解 一、Java当中的json对象和json字符串 在 Java 中&#xff0c;JSON 对象和 JSON 字符串有不同的表示和操作方式。 1. JSON 对象&#xff1a; 如果你使用的是 org.json 库&#xff0c;创建 JSON 对象的代码如下&#xff1…...

ARM64 Trust Firmware [四]

完成第二阶段 BL2 的操作后就加载并进入 BL31&#xff0c;BL31 位于 DRAM 中&#xff0c;EL3 模式。除了做架构初始化和平台初始化外&#xff0c;还做了如下工作&#xff1a; 基本硬件初始化&#xff0c;比如 GIC&#xff0c;串口&#xff0c;timer 等&#xff1b;PSCI 服务的…...

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker&#xff0c;这是一个基于网络的计算平台&#xff0c;旨在简化和加速 EnzyDock 对接模拟的设置过程&…...

Sklearn常用算法及建模流程总结

Scikit-learn&#xff08;简称 Sklearn&#xff09;是 Python 中最流行的机器学习库之一&#xff0c;提供了丰富的算法和工具用于数据预处理、模型训练、评估和调优。下面整理了一些常用算法及建模流程&#xff0c;供大家参考学习。 1.常用算法分类 1. 监督学习&#xff08;S…...

华为IPD简介

创作灵感 现在“熟悉华为IPD”经常出现在高级招聘岗位能力要求上&#xff0c;于是作者写下此文章以此巩固相关知识储备 名词解释 华为IPD&#xff08;Integrated Product Development&#xff0c;集成产品开发&#xff09;是华为引入并优化的一套产品开发管理体系&#xff0…...