设计模式学习之——工厂模式
设计模式中的工厂模式主要分为三种:简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。
下面是对这三种工厂模式的详细介绍和对比。
一、简单工厂模式
-
定义:简单工厂模式又称静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
-
结构:
- 工厂角色:工厂类,是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类可以直接被外界调用,创建所需的产品对象。
- 抽象产品角色:简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口。
- 具体产品角色:简单工厂模式所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
-
优缺点:
- 优点:
- 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例,客户端可以免除直接创建产品对象的职责。
- 客户端无需知道所创建具体产品的类名,只需知道参数即可。
- 可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
- 缺点:
- 工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响。
- 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度。
- 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂。
- 简单工厂模式使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
- 优点:
-
适用环境:
- 工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑过于复杂。
- 客户端只知道传入工厂类的参数,对如何创建对象不关心。
代码示例:
// 抽象产品类
public abstract class Vedio {public abstract void produce();
}// 具体产品类1
public class JavaVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Java 视频");}
}// 具体产品类2
public class PythonVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Python 视频");}
}// 工厂类
public class VedioFactory {public Vedio getVedio(String type) {Vedio vedio = null;if ("Java".equals(type)) {vedio = new JavaVedio();} else if ("Python".equals(type)) {vedio = new PythonVedio();}return vedio;}
}// 测试类
public class Main {public static void main(String[] args) {Vedio javaVedio = new VedioFactory().getVedio("Java");javaVedio.produce();Vedio pythonVedio = new VedioFactory().getVedio("Python");pythonVedio.produce();}
}
二、工厂方法模式
-
定义:工厂方法模式又称多态性工厂模式,属于设计模式三大分类中的创建型模式。它定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法让实例化推迟到子类。
-
结构:
- 抽象工厂角色:成为抽象工厂类,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品应当被实例化这种细节。
- 具体工厂角色:实现抽象工厂类中的抽象方法,完成具体产品的创建。
- 抽象产品角色:定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品角色:实现了抽象产品角色所定义的接口,由具体工厂来创建。
-
优缺点:
- 优点:
- 用户只需要关系所需产品对应的工厂,无须关心创建细节。
- 加入新产品符合开闭原则,提高可扩展性。
- 缺点:
- 类的个数容易过多,增加复杂度。
- 增加了系统的抽象性和理解难度。
- 优点:
-
应用场景:
- 客户只知道创建产品的工厂名,而不知道具体的产品名。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌。
代码示例:
// 抽象产品类
public abstract class Vedio {public abstract void produce();
}// 具体产品类1
public class JavaVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Java 视频");}
}// 具体产品类2
public class PythonVedio extends Vedio {@Overridepublic void produce() {System.out.println("录制 Python 视频");}
}// 抽象工厂类
public abstract class VedioFactory {public abstract Vedio getVedio();
}// 具体工厂类1
public class JavaVedioFactory extends VedioFactory {@Overridepublic Vedio getVedio() {return new JavaVedio();}
}// 具体工厂类2
public class PythonVedioFactory extends VedioFactory {@Overridepublic Vedio getVedio() {return new PythonVedio();}
}// 测试类
public class Main {public static void main(String[] args) {VedioFactory javaFactory = new JavaVedioFactory();Vedio javaVedio = javaFactory.getVedio();javaVedio.produce();VedioFactory pythonFactory = new PythonVedioFactory();Vedio pythonVedio = pythonFactory.getVedio();pythonVedio.produce();}
}
三、抽象工厂模式
-
定义:抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。它是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
-
结构:
- 抽象工厂角色:提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
- 具体工厂角色:实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品角色:定义了产品的规范,描述了产品的主要特性和功能。抽象工厂模式有多个抽象产品。
- 具体产品角色:实现了抽象产品角色所定义的接口,由具体工厂来创建,它与具体工厂之间是多对一的关系。
-
优缺点:
- 优点:
- 具体产品在应用层代码隔离,无须关心创建细节。
- 将一个系列的产品族统一到一起创建。
- 缺点:
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
- 增加了系统的抽象性和理解难度。
- 优点:
-
使用条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
代码示例:
// 抽象产品类1
public abstract class Fridge {public abstract void produce();
}// 具体产品类1
public class MideaFridge extends Fridge {@Overridepublic void produce() {System.out.println("生产美的冰箱");}
}// 具体产品类2
public class GreeFridge extends Fridge {@Overridepublic void produce() {System.out.println("生产格力冰箱");}
}// 抽象产品类2
public abstract class AirConditioner {public abstract void produce();
}// 具体产品类3
public class MideaAirConditioner extends AirConditioner {@Overridepublic void produce() {System.out.println("生产美的空调");}
}// 具体产品类4
public class GreeAirConditioner extends AirConditioner {@Overridepublic void produce() {System.out.println("生产格力空调");}
}// 抽象工厂接口
public interface Factory {Fridge getFridge();AirConditioner getAirConditioner();
}// 具体工厂类1
public class MideaFactory implements Factory {@Overridepublic Fridge getFridge() {return new MideaFridge();}@Overridepublic AirConditioner getAirConditioner() {return new MideaAirConditioner();}
}// 具体工厂类2
public class GreeFactory implements Factory {@Overridepublic Fridge getFridge() {return new GreeFridge();}@Overridepublic AirConditioner getAirConditioner() {return new GreeAirConditioner();}
}// 测试类
public class Main {public static void main(String[] args) {Factory mideaFactory = new MideaFactory();Fridge mideaFridge = mideaFactory.getFridge();AirConditioner mideaAirConditioner = mideaFactory.getAirConditioner();mideaFridge.produce();mideaAirConditioner.produce();Factory greeFactory = new GreeFactory();Fridge greeFridge = greeFactory.getFridge();AirConditioner greeAirConditioner = greeFactory.getAirConditioner();greeFridge.produce();greeAirConditioner.produce();}
}
四、对比
-
结构差异:
- 简单工厂模式只有一个工厂类,负责创建所有产品。
- 工厂方法模式有一个抽象工厂接口和多个具体工厂类,每个具体工厂类负责创建一种产品。
- 抽象工厂模式有一个抽象工厂接口和多个具体工厂类,但每个具体工厂类负责创建一组相关或相互依赖的产品。
-
扩展性:
- 简单工厂模式扩展新产品时需要修改工厂类的逻辑,不符合开闭原则。
- 工厂方法模式扩展新产品时只需添加新的具体产品类和对应的具体工厂类,符合开闭原则。
- 抽象工厂模式扩展新产品族时需要修改抽象工厂接口和具体工厂类,但扩展同一产品族内的新产品时只需添加新的具体产品类,部分符合开闭原则。
-
复杂度:
- 简单工厂模式结构相对简单,但工厂类职责过重。
- 工厂方法模式增加了类的个数,但降低了类的耦合度。
- 抽象工厂模式结构最复杂,但提供了更高的灵活性和可扩展性。
五、工厂模式在Spring框架中的应用
工厂模式(Factory Pattern)作为创建型模式,其核心思想是通过定义一个接口来创建对象,并让子类决定实例化哪个类。这种模式在Spring框架中得到了广泛的应用,特别是在其核心的控制反转(IoC)容器中。
以下是对工厂模式在Spring框架中应用的介绍:
一些常见的应用:
-
BeanFactory:
- Spring最基础的容器,采用了工厂方法模式来创建和管理bean。
- 在Spring 2.x及以前版本,BeanFactory常用于对象的实例化,尤其是对于需要延迟加载的bean(懒加载)。
- BeanFactory接口定义了用于获取bean的基本方法,如getBean(),客户端可以通过这个方法来请求容器中的bean。
-
ApplicationContext:
- Spring的核心容器,继承自BeanFactory,提供了更多的功能,如事件传播、国际化支持、AOP等。
- ApplicationContext也是通过工厂方法模式来创建和管理bean的。它会根据配置文件(XML配置或注解配置)动态地创建bean并管理它们的生命周期。
-
FactoryBean接口:
- 用于通过工厂类动态创建复杂的对象或自定义bean的创建逻辑。
- FactoryBean接口的核心方法是getObject(),它允许开发者在bean的实例化过程中执行自定义逻辑。
- 例如,FactoryBean常常用于创建数据库连接池或外部资源的管理。
实现说明:
-
简单工厂模式的应用:
- 在Spring框架中,简单工厂模式常用于根据配置文件或者运行时参数来动态地创建对象。
- 例如,可以定义一个简单工厂类CarFactory,根据传入的参数来创建不同类型的汽车对象。
-
工厂方法模式的应用:
- 在Spring框架中,工厂方法模式常用于创建复杂对象或者对象组合,以便更好地管理对象的创建逻辑。
- 例如,可以定义一个抽象的数据库连接工厂ConnectionFactory,并在子类中实现具体的连接创建逻辑。
-
抽象工厂模式的应用:
- 在Spring框架中,抽象工厂模式常用于创建具有不同主题或风格的对象组合。
- 例如,可以定义一个抽象的主题工厂ThemeFactory,用于创建按钮和文本框等相关的UI组件。
优势:
- 解耦:通过工厂模式,Spring框架解耦了客户端与对象的依赖关系,使得客户端不再关心具体的类实现,而只需要依赖工厂接口来获取实例。
- 灵活性:工厂模式使得对象的创建变得非常灵活和动态,可以根据配置文件或注解动态配置bean。
- 可扩展性:通过工厂模式,Spring框架可以轻松地添加新的bean类型,而无需修改现有的客户端代码
六、拓展:Spring中的BeanFactory与FactoryBean
BeanFactory和FactoryBean都是Spring框架中重要的概念,它们在Spring的IoC(控制反转)容器中扮演着不同的角色。下面将详细介绍这两个概念,以及它们之间的区别与联系。
BeanFactory
- 定义与角色:
- BeanFactory是Spring框架中的一个接口,它是Spring IoC容器的基础。
- 它负责创建、配置和管理Bean对象,是Spring容器的基本规范和行为定义。
- 主要功能:
- 提供Bean的创建、配置、初始化和销毁等基本操作。
- 可以根据配置文件(如XML文件)或注解来创建并管理Bean实例。
- 提供了各种方法来获取和操作Bean实例,如
getBean()
方法。
- 实现类:
- 常见的实现类有
XmlBeanFactory
(在Spring 3.x之前使用较多)和DefaultListableBeanFactory
等。 XmlBeanFactory
通过解析XML配置文件来创建和管理Bean。DefaultListableBeanFactory
则提供了更丰富的功能,是Spring默认的BeanFactory实现。
- 常见的实现类有
FactoryBean
- 定义与角色:
- FactoryBean是Spring框架中的一个特殊接口,用于创建复杂的或可配置的Spring Bean实例。
- 它本身也是一个Bean,但与其他Bean不同的是,它通过实现
FactoryBean
接口来定义自己的创建逻辑。
- 主要功能:
- 允许在创建Bean时进行更多的自定义操作,如依赖注入、配置读取等。
- 可以隐藏实际创建Bean的复杂逻辑,对外提供一个简单的接口。
- 提供了
getObject()
方法来返回创建的Bean实例,以及getObjectType()
和isSingleton()
方法来描述Bean的特性和类型。
- 应用场景:
- 常用于创建数据库连接池、外部资源管理、复杂对象组合等场景。
- 在AOP(面向切面编程)中,
ProxyFactoryBean
等FactoryBean实现类用于创建代理对象。
区别与联系
- 区别:
- 角色与功能:BeanFactory是Spring IoC容器的基础接口,负责Bean的创建、配置和管理;而FactoryBean是一个特殊的Bean,用于定义自己的创建逻辑和返回创建的Bean实例。
- 使用方式:BeanFactory通常作为Spring容器的入口点,用于获取和管理Bean;而FactoryBean则通过实现接口并在配置文件中声明来使用,以创建复杂的Bean实例。
- 灵活性:FactoryBean提供了更高的灵活性,允许在Bean创建过程中进行更多的自定义操作;而BeanFactory则更侧重于提供基本的容器功能。
- 联系:
- 都属于Spring框架:BeanFactory和FactoryBean都是Spring框架中的概念,它们共同构成了Spring IoC容器的核心部分。
- 相互协作:在Spring容器中,BeanFactory负责管理和维护Bean的实例;而FactoryBean则可以在Bean的创建过程中提供额外的自定义逻辑。因此,它们在一定程度上是相互协作的。
- 综上所述,BeanFactory和FactoryBean在Spring框架中扮演着不同的角色,但它们共同构成了Spring IoC容器的核心部分。了解它们之间的区别与联系有助于更好地理解和使用Spring框架。
相关文章:
设计模式学习之——工厂模式
设计模式中的工厂模式主要分为三种:简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。 下面是对这三种工厂模式的详细…...
分布式专题(4)之MongoDB快速实战与基本原理
一、MongoDB介绍 1.1 什么是MongoDB MongoDB是一个文档数据库(以JSON为数据模型),由C语言编写,旨在为WEB应用提供可扩展的高性能存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富…...
什么是MAC地址?什么是IP地址?IP地址与MAC地址是什么关系?
MAC地址是指Media Access Control Address,媒体访问控制地址。MAC地址被烧录在网络设备的ROM之内, IP地址类似于门牌号码,有了门牌号码,邮差才知道把邮件投送到哪里。 有人新建房屋了,就会分配新的门牌号码(…...
FireFox火狐浏览器企业策略禁止更新
一直在用火狐浏览器,但是经常提示更新,进入浏览器右上角就弹出提示,比较烦。多方寻找,一直没有找到合适的方案,毕竟官方没有给出禁用检查更新的选项,甚至about:config里都没有。 最终找到了通过企业策略控…...
C++中面向对象编程如何实现数据隐藏?
概念 在 C 中,面向对象编程(OOP)中的数据隐藏是指将对象的内部数据(成员变量)保护起来,只允许通过特定的公共接口(方法)去访问和修改这些数据。这种做法可以确保对象的状态保持一致…...
使用 rbenv 切换 Ruby 版本
1. 查看当前 Ruby 版本 首先,查看当前系统中安装的 Ruby 版本: ruby -v如果你已经安装了 rbenv,可以列出通过 rbenv 安装的 Ruby 版本: rbenv versions2. 安装 Ruby 版本 如果你想安装新的 Ruby 版本,使用以下命令…...
6.4 CPU性能分析--Intel处理器跟踪技术
Intel处理器跟踪PT技术是记录程序执行过程的技术,它把记录信息编码报文存到高压缩率的二进制文件中。该二进制文件结合每条指令的时间戳重建执行流。PT技术覆盖度大,开销小,有关开销的信息详见,主要用于性能问题的事后分析和根因定…...
智能设备安全-固件逆向分析
固件逆向分析实验报告-20241022 使用固件常用逆向分析工具,对提供的固件进行文件系统提取,并记录逆向分析实验过程,提交实验报告(报告要求图文并茂,对涉及到的关键步骤附截图说明)。具体任务如下࿱…...
Elasticsearch Java Api Client中DSL语句的查询方法汇总(二)
接上一篇:《Elasticsearch Java Api Client中DSL语句的查询方法汇总》 说明:示例代码依赖的是co.elastic.clients:elasticsearch-java:8.16.1。 1、ScriptQuery方法 用途:它允许用户使用脚本(通常是 Painless 脚本语言…...
xshell连接虚拟机,更换网络模式:NAT->桥接模式
NAT模式:虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码,只要宿主机能够访问网络,虚拟机也能够访问。对外部网络而言,它看到的是宿主机的IP地址,而不是虚拟机的IP。但是,宿主机可…...
【经验分享】OpenHarmony5.0.0-release编译RK3568不过问题(已解决)
问题描述 根据操作手册正常拉取代码,然后编译OpenHarmony5.0.0版本rk3568项目 编译命令 ./build.sh --product-name rk3568 --ccache出现如下报错 然后真正开始出错的位置是下面这句log FAILED: ../kernel/src_tmp/linux-5.10/boot_linux ../kernel/checkpoint/c…...
线上维修记录查询,让车辆保养更省心!
车辆保养对于每一位车主来说都是一个必不可少的环节,它不仅可以延长车辆的使用寿命,还能提高行车安全性。然而,相信很多人都有这样的经历:不知道自己的车辆什么时候进行过维修,也不清楚维修的内容和费用。这样一来&…...
【机器学习】基础知识:拟合度(Goodness of Fit)
拟合度概念及意义 拟合度(Goodness of Fit)是衡量统计模型对数据解释能力的指标,用于评价模型对观测数据的拟合效果。在回归分析、分类模型或其他预测模型中,拟合度是模型性能的重要衡量标准。 1. 拟合度的作用 拟合度的主要作用…...
排序算法(2)——快速排序
目录 1. 实现方式 1.1 霍尔法 1.2 挖坑法 1.3 前后指针法 2. 时间复杂度分析 3. 快速排序优化 3.1 三数取中 3.2 小区间使用插入排序 3.3 非递归实现 快速排序是英国计算机科学家托尼・霍尔(C. A. R. Hoare)在 1960 年年提出的一种二叉树结构…...
测试招工组,解决三个问题
所以我们今天的目标-----找工作! 那么我要找什么工作?如何能胜任这份工作?怎么让单位选择我?这是我们面临的三个问题。 一、我要找什么样的工作 解决这个问题,可以根据你当下已经掌握的能力,和毕业及工作…...
探索《Crypto Rumble》 游戏:经济模型篇
《Crypto Rumble》是一款基于 Zypher Network 游戏引擎打造的卡牌 RPG三消品类的 Web3 游戏,通过引人入胜的游戏设计以及轻量化的游戏玩法,《Crypto Rumble》不仅能够为玩家带来引人入胜的沉浸式游戏体验,同时基于 AI Bot 的游戏编辑器&#…...
《Python WEB安全 库全攻略》
《Python WEB安全 库全攻略》 一、引言二、Python WEB安全 库概述三、热门 Python WEB 安全库1. Flask-Security项目简介与功能:快速入门:使用场景与优势: 2. Flask-SeaSurf项目用途:项目特点:示例代码: 3.…...
DWA(一) —— 理论篇
1 DWA算法概述 DWA的原理:在速度空间(v,w)中采样多组速度,并模拟出这些速度在一定时间内的运动轨迹,并通过评价函数对这些轨迹进行评价,选取最优轨迹对应的(v,w)驱动机器人运动。 优点: (1)计算复杂度低:考虑到速度和加速度的限制,只有安全的轨迹会被考虑,且每次采…...
Ubuntu22.04搭建FTP服务器保姆级教程
在网络环境中,文件传输是一项至关重要的任务。FTP(文件传输协议)是一种基于客户端/服务器模式的协议,广泛用于在互联网上传输文件。Ubuntu作为一款流行的Linux发行版,因其稳定性和易用性而广受开发者和系统管理员的喜爱…...
微信小程序5-图片实现点击动作和动态加载同类数据
搜索 微信小程序 “动物觅踪” 观看效果 感谢阅读,初学小白,有错指正。 一、功能描述 a. 原本想通过按钮加载背景图片,来实现一个可以点击的搜索button,但是遇到两个难点,一是按钮大小调整不方便(网上搜索…...
leetcode 接雨水II(407)
题目: 给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输出: 4 解释: 下雨后,雨水…...
使用 ESP32 构建倒车雷达系统:蜂鸣器警报功能详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:趣享先生的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏&…...
Cesium中实现仿ArcGIS三维的动态图层加载方式
Cesium 加载 ArcGIS 动态图层的方式 如果你在 Cesium 中加载过 ArcGIS 的动态图层,你会发现,Cesium 对于动态图层仍然采用类似切片图层的逻辑进行加载。也就是每个固定的瓦片 export 一张图片。 这样会造成一些问题: 请求量大,…...
国际荐酒师(香港)协会亮相第六届地博会助力中欧地标交流合作
国际荐酒师(香港)协会亮相第六届知交会暨地博会,助力中欧地理标志产品交流合作 12月9日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会(以下简称“第六届知交会暨地博会”)在中新广州…...
java八股-索引下推(图解对比)
参考链接 https://xiaolincoding.com/mysql/base/how_select.html#%E6%89%A7%E8%A1%8C%E5%99%A8 https://javaguide.cn/database/mysql/mysql-index.html#%E7%B4%A2%E5%BC%95%E4%B8%8B%E6%8E%A8 如何理解索引下推这个概念,其实就是index把Server层的工作࿰…...
自荐一部IT方案架构师回忆录
作者本人毕业于一个不知名大专院校,所读专业计算机科学技术。2009年开始IT职业生涯,至今工作15年。擅长TSQL/Shell/linux等技术,曾经就职于超万人大型集团、国内顶级云厂商、央国企公司。参与过运营商大数据平台、大型智慧城市ICT、云计算、人…...
C语言理解 —— 实用的字符串函数
目 录 字符串函数的头文件strlenstrstrstrncpystrncmp 字符串函数的头文件 #include <string.h>strlen 计算字符串长度的,从字符的首地址开始遍历,以 ‘\0’ 为结束标志,然后将计算的长度返回,但是计算的长度不包含’\0’…...
“Python-OpenCV初体验:简单实现颜色识别与轮廓绘制”
一、引言 图像处理技术在现代科技中扮演着重要角色,但对于初学者来说,掌握这些技术可能显得有些复杂。在这篇博客中,我们将带你一步步了解如何利用Python和OpenCV来识别图像中的颜色并绘制轮廓。通过简明的实验原理和代码示例,你…...
导游现场面试需要注意的问题
今天给大家带来一些导游现场面试需要注意的问题,大部分的城市导游考试已经考完了,但是还有一些城市的十二月份才考,有需要的朋友们赶紧来看,有备无患。 01、做好充足准备 认真准备做好每个景点的讲解介绍,不要抱有侥幸…...
JDK8新特性:Stream
JDK8最大的改变: 1. lambda表达式 2. Stream 1. Steam流的入门 什么是Stream? 也叫Stream流,是jdk8开始的一套API,用于操作集合或者数组中的数据 优点: Stream流大量结合了Lambda的语法风格来创建,提…...
CSS的2D和3D动画效果
CSS的2D和3D动画效果:网页动态设计的魔法 在现代网页设计中,动画已经成为提升用户体验的重要元素。通过引入动态效果,我们不仅可以使交互更加流畅和直观,还能吸引用户的注意力,增强品牌认知度。CSS提供了强大的工具&a…...
OpenCV相机标定与3D重建(16)将点从齐次坐标转换为非齐次坐标函数convertPointsFromHomogeneous()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::convertPointsFromHomogeneous 是 OpenCV 库中的一个函数,用于将点从齐次坐标(homogeneous coordinates)…...
动态流程图制作方法
动态流程图制作方法 1.方法1 有各种 echars模板 可以自己改代码 https://www.isqqw.com/viewer?id42201echars 在线生成 https://codevtool.com/echarts2. 方法2电脑软件,画图的。 《亿图图示》...
【pytroch】线性回归
构造一个PyTorch数据迭代器 def load_array(data_arrays, batch_size, is_trainTrue): #save"""构造一个PyTorch数据迭代器"""dataset data.TensorDataset(*data_arrays)return data.DataLoader(dataset, batch_size, shuffleis_train)batch_…...
前端请求后端接口报错(blockedmixed-content),以及解决办法
报错原因:被浏览器拦截了,因为接口地址不是https的。 什么是混合内容(Mixed Content) 混合内容是指在同一页面中同时包含安全(HTTPS)和非安全(HTTP)资源的情况。当浏览器试图加载非…...
基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理
基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…...
Pull requests 和Merge Request其实是一个意思
Pull requests的定义 在Git中,PR(Pull Request)是一种协作开发的常用方式。它允许开发者将自己的代码变更(通常是一个分支)提交到项目的仓库中,然后请求负责代码审查的人员将这些变更合并到主分支中。通过…...
网络原理03
回顾 应用层:应用程序,数据具体如何使用 传输层:关注起点和终点 网络层:关注路径规划 数据链路层:关注相邻节点的转发 物理层:硬件设备 应用层 应用程序 在应用层,很多时候,…...
yarn 安装问题
Couldn’t find package “regenerator-runtime” on the “npm” registry. Error: Couldn’t find package “watch-size” on the “npm” regist 标题Error: Couldn’t find package “babel-helper-vue-jsx-merge-props” on the “npm” registry. Error: Couldn’t f…...
优选算法——分治(快排)
1. 颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) 题目展示: 题目分析:本题其实就要将数组最终分成3块儿,这也是后面快排的优化思路,具体大家来看下图。 这里我们上来先定义了3个指针&…...
深入解析强化学习中的 Generalized Advantage Estimation (GAE)
中文版 深入解析强化学习中的 Generalized Advantage Estimation (GAE) 1. 什么是 Generalized Advantage Estimation (GAE)? 在强化学习中,计算策略梯度的关键在于 优势函数(Advantage Function) 的设计。优势函数 ( A ( s , a ) A(s, a…...
PostgreSQL/PostGIS中提升空间查询(分析)性能(效率)的一些方法
目录 1. 使用适当的索引 1.1 索引类型 1.2 分析查询计划 1.3 覆盖索引 1.4 复合索引 1.5 维护索引 1.6 删除不必要的索引 1.7 使用适当的数据类型 2. 建立分区表 2.1 分区表的基本概念 2.2 创建分区表的步骤 2.3 空间数据的分区 2.4 分区表优点 3. 简化几何形状 …...
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球最受欢迎的Web服务器软件,支持约30.2%的所有活跃网站。凭借其可靠性、灵活性和强大的功能,Apache数十年来一直是互联网的中坚力量。 一、Apache Web服务器的工作原理 Apache Web服务器的工作原理如下: 接收HTTP请求࿱…...
攻防世界Reversing-x64Elf-100
一、使用Exeinfo PE 查壳 64无壳 二、使用IDA静态分析 1.找main 总览分析到:要使sub_4006FD出0,就可以得到"Nice!" 2.找到关键函数sub_4006FD 总览分析:v3是二维数组,要使if( )里的值1,就可以出0 分析if(…...
MySQL生产环境备份脚本
全量备份脚本,其中BakDir,ZlbakDir,LogFile需要自己创建 #!/bin/bash export LANGen_US.UTF-8# 指定备份目录 BakDir/root/beifen/data/mysqlbak/data/allbak # 指定增量备份目录 ZlbakDir/root/beifen/data/mysqlbak/data/zlbak # 备份日志…...
redis 怎么样删除list
在 Redis 中,可以使用以下方法删除列表或列表中的元素: 1. 删除整个列表 使用 DEL 命令删除一个列表键: DEL mylist这个命令会删除键 mylist 及其值(无论 mylist 是一个列表还是其他类型的键)。 2. 删除列表中的部分…...
uniapp小程序 slot中无法传递外部参数的解决方案
最近在封装一个List组件,外部传给我数据,我循环后将每个Item部分slot到外部,由调用者自己去写item布局,类似ElementUI、iView的Tabe列表。 List: <view v-if"list.length > 0" class"list-scroll__item&quo…...
Java面试之实现多线程(二)
此篇接上一篇Java面试之什么是多线程(一) Java多线程是Java语言中的一个重要特性,它可以实现并发处理、提高程序的性能和响应能力。开发者需要了解多线程的概念和机制,并采用合适的多线程编程模型和同步机制,以保证程序的正确性和稳定性。Jav…...
论文笔记:Treat Visual Tokens as Text? But Your MLLM Only Needs Fewer Efforts to See
2024 10月的arxiv 1 主要idea 针对多模态大模型(如LLaVA),提出了一系列高效的剪枝策略 在显著降低计算开销(多达 88%)的同时,保持了模型在多模态任务中的性能表现 2 目前的问题 与文本 token 相比&…...
HDOJ 1735:字数统计 ← 贪心
【题目来源】https://acm.hdu.edu.cn/showproblem.php?pid1735【题目描述】 一天,淘气的 Tom 不小心将水泼到了他哥哥 Jerry 刚完成的作文上。原本崭新的作文纸顿时变得皱巴巴的,更糟糕的是由于水的关系,许多字都看不清了。可怜的 Tom 知道他…...