Java面向对象(高级)-- 单例(Singleton)设计模式
文章目录
- 一、单例设计模式
- (1) 设计模式概述
- (2) 何为单例模式
- (3) 实现思路
- (4) 单例模式的两种实现方式
- 1. 饿汉式
- 2. 懒汉式
- 3. 饿汉式 vs 懒汉式
- (5) 单例模式的优点及应用场景
- 二、理解main方法的语法
- (1)main()方法的剖析
- (2)与控制台交互
- 1.举例1
- 1.1 方式一、命令行
- 1.2 方法二、编译器
- 2.举例2
- (3)笔试题
一、单例设计模式
(1) 设计模式概述
设计模式是在大量的实践中总结
和理论化
之后优选的代码结构、编程风格、以及解决问题的思考方式。
设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。“套路”
经典的设计模式共有23种。每个设计模式均是特定环境下特定问题的处理方法。
创建型模式:主要用于创建对象,根据不同场景设计不同的设计模式。
简单工厂模式并不是23中经典模式的一种,是其中工厂方法模式的简化版
对软件设计模式的研究造就了一本可能是面向对象设计方面最有影响的书籍:《设计模式》:《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)",而这本书也就被称为"四人组(或 GoF)"书。
(2) 何为单例模式
单例–单独一个实例(对象)
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例(不需要多个对象),并且该类只提供一个取得其对象实例的方法。
(3) 实现思路
如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为private
,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。
因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法
(方法不能是非静态的,因为非静态方法要通过对象去调用,
此时外部无法创建对象来调用方法,只能通过类调用静态方法)以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的
。
(4) 单例模式的两种实现方式
1. 饿汉式
class Singleton {// 1.私有化构造器private Singleton() {}// 2.内部提供一个当前类的实例// 4.此实例也必须静态化private static Singleton single = new Singleton();// 3.提供公共的静态的方法,返回当前类的对象public static Singleton getInstance() {return single;}
}
【举例】
场景:假设Bank只有一个实例。
package yuyi04;public class BankTest {}class Bank{ //假设这个银行只有一个实例:中国人民银行}
①类的构造器私有化 (避免类的外部创建对象)
为了保证这个类只能造一个对象,而造对象需要使用到构造器,那么在这个类外面就不能让它随便调用构造器。
class Bank{ //假设这个银行只有一个实例:中国人民银行//1.类的构造器私有化 (避免类的外部创建对象)//为了保证这个类只能造一个对象,而造对象需要使用到构造器,那么在这个类外面就不能让它随便调用构造器private Bank(){ //构造器私有化,不对外暴露}
}
②在类的内部创建当前类的实例 (一个就可以了)
class Bank{ //假设这个银行只有一个实例:中国人民银行//1.类的构造器私有化 (避免类的外部创建对象)//为了保证这个类只能造一个对象,而造对象需要使用到构造器,那么在这个类外面就不能让它随便调用构造器private Bank(){ //构造器私有化,不对外暴露}//2.在类的内部创建当前类的实例 (一个就可以了)private Bank instance=new Bank(); //可以看作当前类的一个属性 (是当前类类型的),不需要放到方法里面,习惯将它私有化}
③提供私有属性的get方法
类的外部想用这个对象,但是对象被私有化了,外部无法调用,所以要有方法提供
class Bank{ //假设这个银行只有一个实例:中国人民银行//1.类的构造器私有化 (避免类的外部创建对象)//为了保证这个类只能造一个对象,而造对象需要使用到构造器,那么在这个类外面就不能让它随便调用构造器private Bank(){ //构造器私有化,不对外暴露}//2.在类的内部创建当前类的实例 (一个就可以了)private Bank instance=new Bank(); //可以看作当前类的一个属性 (是当前类类型的),不需要放到方法里面,习惯将它私有化//3.提供私有属性的get方法//类的外部想用这个对象,但是对象被私有化了,外部无法调用,所以要有方法提供public Bank getInstance(){return instance; //在方法里面,将造好的对象返回}
}
使用getXxx()方法获取当前类的实例,必须声明为static的。
通过方法返回当前类的实例,那么这个getInstance方法谁来调呢?
现在只能拿“对象”来调用这个方法,才能拿到getInstance方法来获取此对象。(此时在类外部需要一个对象,但是无法通过构造器来创建,只能通过getInstance方法来获取一个对象,但是这个方法也需要通过对象才能调用,而对象需要通过这个方法来获取,绕进去了…)
要想调用getInstance方法来获取对象,肯定不能拿对象去调用,只能通过类来调用,那就意味着getInstance方法需要静态化。
public static Bank getInstance(){return instance; //在方法里面,将造好的对象返回
}
④属性设置为static
上一步将方法声明为static之后,会发现报错,如下:
这是因为静态方法中,只能调用静态属性或方法。
所以instance
也必须静态化,如下:
private static Bank instance=new Bank();
目前整体的Bank类如下:
class Bank{ //假设这个银行只有一个实例:中国人民银行//1.类的构造器私有化 (避免类的外部创建对象)//为了保证这个类只能造一个对象,而造对象需要使用到构造器,那么在这个类外面就不能让它随便调用构造器private Bank(){ //构造器私有化,不对外暴露}//2.在类的内部创建当前类的实例 (一个就可以了)//4.此属性也必须声明为static的private static Bank instance=new Bank(); //可以看作当前类的一个属性 (是当前类类型的),不需要放到方法里面,习惯将它私有化//3.使用getXxx()方法获取当前类的实例,必须声明为static的//类的外部想用这个对象,但是对象被私有化了,外部无法调用,所以要有方法提供public static Bank getInstance(){return instance; //在方法里面,将造好的对象返回}
}
④测试
使用当前类的唯一实例。
package yuyi04;/*** ClassName: BankTest* Package: yuyi04* Description:** @Author 雨翼轻尘* @Create 2023/11/17 0017 8:43*/
public class BankTest {public static void main(String[] args) {//使用当前类的唯一实例Bank bank1=Bank.getInstance();//再通过getInstance方法获取另外一个所谓的实例,其实和上面的实例指向同一个Bank bank2=Bank.getInstance();//测试System.out.println(bank1==bank2);}
}class Bank{ //假设这个银行只有一个实例:中国人民银行//1.类的构造器私有化 (避免类的外部创建对象)//为了保证这个类只能造一个对象,而造对象需要使用到构造器,那么在这个类外面就不能让它随便调用构造器private Bank(){ //构造器私有化,不对外暴露}//2.在类的内部创建当前类的实例 (一个就可以了)//4.此属性也必须声明为static的private static Bank instance=new Bank(); //可以看作当前类的一个属性 (是当前类类型的),不需要放到方法里面,习惯将它私有化//3.使用getXxx()方法获取当前类的实例,必须声明为static的//类的外部想用这个对象,但是对象被私有化了,外部无法调用,所以要有方法提供public static Bank getInstance(){return instance; //在方法里面,将造好的对象返回}
}
输出结果:
2. 懒汉式
class Singleton {// 1.私有化构造器private Singleton() {}// 2.内部提供一个当前类的实例// 4.此实例也必须静态化private static Singleton single;// 3.提供公共的静态的方法,返回当前类的对象public static Singleton getInstance() {if(single == null) {single = new Singleton();}return single;}
}
【举例】
场景:GirlFriend只能有一个实例。
package yuyi04;/*** ClassName: GirlFriend* Package: yuyi04* Description:** @Author 雨翼轻尘* @Create 2023/11/17 0017 9:24*/
public class GirlFriendTest {public static void main(String[] args) {}
}class GirlFriend{}
①**类的构造器私有化 **
class GirlFriend{//1.类的构造器私有化 private GirlFriend(){}
}
②声明当前类的实例,作为一个属性出现。
这时候并没有创建这个对象。
class GirlFriend{//1.类的构造器私有化private GirlFriend(){}//2.声明当前类的实例,作为一个属性出现//和刚才一样,外边不能造对象了,里边就得造。里面造和上一种方法的区别就在于这里只是做了一个声明。private GirlFriend instance=null; //右边在赋值的时候赋值了一个null,若是不写本身也是null
}
③通过getXxx()方法获取当前类的实例,如果未创建对象,则在方法内部进行创建。
通过get方法去调用的时候,发现没有实例化,就帮忙造一下。
class GirlFriend{//1.类的构造器私有化private GirlFriend(){}//2.声明当前类的实例,作为一个属性出现//和刚才一样,外边不能造对象了,里边就得造。里面造和上一种方法的区别就在于这里只是做了一个声明。private GirlFriend instance=null; //右边在赋值的时候赋值了一个null,若是不写本身也是null//3.通过getXxx()方法获取当前类的实例,如果未创建对象,则在方法内部进行创建/*public GirlFriend getInstance(){if(instance==null){ //若此时没有实例化,就实例化一下instance=new GirlFriend();return instance; //创建好实例之后返回即可}else{ //若之前已经创建好对象了,直接return就好return instance;}}*/public GirlFriend getInstance(){if(instance==null){ //若此时没有实例化,就实例化一下instance=new GirlFriend();}//若发现没有实例化,就进入if创建好之后返回即可;若发现已经有实例了,不执行if直接return即可return instance;}
}
这里优化一下,如下:
④静态化属性和方法
和饿汉式一样,getInstance方法需要通过类来调用,所以这里也需要加上static
。如下:
public static GirlFriend getInstance(){if(instance==null){ //若此时没有实例化,就实例化一下instance=new GirlFriend();}//若发现没有实例化,就进入if创建好之后返回即可;若发现已经有实例了,不执行if直接return即可return instance;
}
然后静态方法里面只能调静态的,所以instance也要加上static
。如下:
private static GirlFriend instance=null;
现在整体的GirlFriend
如下:
class GirlFriend{//1.类的构造器私有化private GirlFriend(){}//2.声明当前类的实例,作为一个属性出现//4.此属性也必须声明为static的private static GirlFriend instance=null; //右边在赋值的时候赋值了一个null,若是不写本身也是null//3.通过getXxx()方法获取当前类的实例,如果未创建对象,则在方法内部进行创建public static GirlFriend getInstance(){if(instance==null){ //若此时没有实例化,就实例化一下instance=new GirlFriend();}//若发现没有实例化,就进入if创建好之后返回即可;若发现已经有实例了,不执行if直接return即可return instance;}
}
3. 饿汉式 vs 懒汉式
饿汉式:
- 特点:
立即加载
,即在使用类的时候已经将对象创建完毕。 - 优点:实现起来
简单
;没有多线程安全问题。 - 缺点:当类被加载的时候,会初始化static的实例,静态变量被创建并分配内存空间,从这以后,这个static的实例便一直占着这块内存,直到类被卸载时,静态变量被摧毁,并释放所占有的内存。因此在某些特定条件下会
耗费内存
。
懒汉式:
- 特点:
延迟加载
,即在调用静态方法时实例才被创建。 - 优点:实现起来比较简单;当类被加载的时候,static的实例未被创建并分配内存空间,当静态方法第一次被调用时,初始化实例变量,并分配内存,因此在某些特定条件下会
节约内存
。 - 缺点:在多线程环境中,这种实现方法是完全错误的,
线程不安全
,根本不能保证单例的唯一性。- 说明:在多线程章节,会将懒汉式改造成线程安全的模式。
【举例】
还是拿上面两个例子作比较,如下:(这里过滤掉属性了,针对当前创建的实例没有任何属性,它不属于单例模式的核心问题,这里就过滤掉了)
“饿汉式
”一上来就把对象创建好了(立即加载),静态声明的变量随着类的加载而加载,比较早得出现在内存当中,需要用得时候直接拿来用;同样随着类的消亡而消亡,其实并不会轻易卸载类,类都加载到方法区内,GC回收方法区的频率非常低,此时试图卸载一个类也非常困难,因为这个类可能会在任意地方被使用(包括被类的加载器所引用,类的加载器不消亡它也不会消亡,同样静态变量也消除不了,所以在内存中占用时间就会很长)。
“懒汉式
”一上来没有创建,当需要的时候才创建(延时加载)。
从内存节省的角度来说,“懒汉式”比较好,“饿汉式”实例的生命周期有点长。
之前说过的“内存泄露
”-- 本身是个垃圾,但是GC还没有帮我们回收。在一定程度上来说,有的变量也谈不上泄露,但是它的生命周期特别长,使用的时间又特别短,多余的时间不想要(可以回收掉),但是它是静态的,导致生命周期很长却没有办法回收,一定程度上也可以认为是泄露(生命周期过长,超出了使用的范围)。
【对比两种模式】(特点、优缺点)
- 特点
- 饿汉式:“立即加载”,随着类的加载,当前的唯一实例就创建了。
- 懒汉式:“延迟加载”,在需要使用的时候,进行创建。
- 优缺点
- 饿汉式:(优点)写法简单,由于内存中较早加载,使用更方便、更快。是线程安全的。 (缺点)内存中占用时间较长。
- 懒汉式:(缺点)线程不安全 (有可能会创建好几次对象,放到多线程章节时解决)(优点)在需要的时候进行创建,节省内存空间。
(5) 单例模式的优点及应用场景
由于单例模式只生成一个实例,减少了系统性能开销
,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
举例:
Java中有一个类叫Runtime(运行时环境),单例设计模式–饿汉式,如下:
应用场景
- Windows的Task Manager (任务管理器)就是很典型的单例模式 。
- Windows的Recycle Bin (回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
- Application 也是单例的典型应用。
- 应用程序的日志应用,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只
能有一个实例去操作,否则内容不好追加。 - 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
二、理解main方法的语法
(1)main()方法的剖析
public static void main(String args[]){}
理解1:看做是一个普通的静态方法。
理解2:看做是程序的入口,格式是固定的。
解释:
public
–此方法权限很大,在整个项目中都能看得到。
static
–静态的,随着类的加载而加载。main方法是程序的入口,不能说一上来就造一个本类的对象,若是造对象才能掉方法,但是造对象的方法也得在程序入口里面做,卡死了。所以这个时候方法不能拿对象去调,只能拿类去调,所以只能是static的。
void
–这个方法执行完也不需要返回,也没有可以返回的结构了,已经是最基础的方法了。
main
–这个方法比较特别,是程序的入口,所以写成main表示入口的意思。
由于JVM需要调用类的main()
方法,所以该方法的访问权限必须是public
,又因为JVM在执行main()方法时不必创建对象,所以该方法必须是static
的,该方法接收一个String
类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数。
又因为main() 方法是静态的,我们不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员,这种情况,我们在之前的例子中多次碰到。
【举例】
package yuyi04;/*** ClassName: MainTest* Package: yuyi04* Description:** @Author 雨翼轻尘* @Create 2023/11/18 0018 20:55*/
public class MainTest {public static void main(String[] args) { //程序的入口//造一个String类型的数组String[] arr=new String[]{"AA","BB","CC"};//通过Main类来调用此类中的静态方法main()Main.main(arr);}
}class Main{public static void main(String[] args) { //看作是普通的静态方法//把参数对应的数组遍历一下System.out.println("Main的main()的调用");for (int i = 0; i < args.length; i++) {System.out.println(args[i]);}}
}
输出结果:
(2)与控制台交互
可以发现,main方法带了一个形参String args[]
,到目前为止好像没有用过它,有啥用呢?
💬如何从键盘获取数据?
方式1:使用
Scanner
(传的是各种类型)方式2:使用
main()
的形参进行传值。(只能传递String类型)
1.举例1
先写一段代码。
【MainDemo.java】
package yuyi04;/*** ClassName: MainDemo* Package: yuyi04* Description:** @Author 雨翼轻尘* @Create 2023/11/19 0019 7:38*/
public class MainDemo {public static void main(String[] args) { //当我们调用main方法时,传递了一个String数组for (int i = 0; i < args.length; i++) { //遍历打印System.out.println("hello:"+args[i]);}}
}
1.1 方式一、命令行
先将文件【MainDemo.java】复制到一个文件夹中,比如D盘:
命令行的时候没有包的概念,记得将第一行导包注释掉,如下:
记得将文件的字符集改为“ANSI”,因为黑窗口的字符集默认GBK,如下:
改为ANSI,才不会乱码:
执行文件:
由于代码没有输入任何数据,所以args.length是0,就没有任何执行效果啦。
那如何传呢?
在写完类名的时候,再写一个空格,后边就可以输入数据了,第一个要加双引号,后边可以不用,中间用空格隔开,注意一定要是英文格式下。比如:java MainDemo "Tom" Jarry 89 true
,回车之后便可输出,如下:
相当于args数组的长度是4,依次遍历了它的元素。(从控制台获取String类型的数据)
在代码层面,可以把89转化为int类型,把true转化为boolean类型。(讲包装类的时候再说这个问题)
1.2 方法二、编译器
上面演示了命令行的方式,那么在idea编译器中如何体现传值呢?
先配置一下。
“运行”–>“编辑配置”:
可以看到如下信息:
找到这个地方,点击它:
然后输入“MainDemo”,选中这个文件:
现在就可以在这个地方输入了:
比如:(中间用空格隔开)
回到编译器中再次Run,可以发现刚才的数据输出了:
其实还有其他的方法,这里做了解就好,不必追究。
2.举例2
代码部分:
public class CommandPara {public static void main(String[] args) {for (int i = 0; i < args.length; i++) {System.out.println("args[" + i + "] = " + args[i]);}}
}
//运行程序CommandPara.java
java CommandPara "Tom" "Jerry" "Shkstart"
IDEA工具:
(1)配置运行参数
(2)运行程序
输出:
//输出结果
args[0] = Tom
args[1] = Jerry
args[2] = Shkstart
(3)笔试题
如下:
//此处,Something类的文件名叫OtherThing.java
class Something {public static void main(String[] something_to_do) { System.out.println("Do something ...");}
}//上述程序是否可以正常编译、运行? 可以
相关文章:

Java面向对象(高级)-- 单例(Singleton)设计模式
文章目录 一、单例设计模式(1) 设计模式概述(2) 何为单例模式(3) 实现思路(4) 单例模式的两种实现方式1. 饿汉式2. 懒汉式3. 饿汉式 vs 懒汉式 (5) 单例模式的…...
【Kingbase FlySync】命令模式:安装部署同步软件,实现Oracle到KES实现同步
【Kingbase FlySync】命令模式:安装部署同步软件,实现Oracle到KES实现同步 一.准备工作二.环境说明三.目标四.资源虚拟机 五.实操(1).准备安装环境Orcle服务器(Oracle40)1.上传所有工具包2.操作系统配置a.增加flysync 用户、设置密码b.配置环境变量c.调整limits.con…...
2311d导入c的语义不同
原文 以下D代码正常工作: enum X "X"; import core.stdc.stdio; void main(){puts(X); }但是,如果该X枚举是C文件中#define的结果,则会出现错误: //x.c #define X "X" //D代码 import x; import core.stdc.stdio; void main(){puts(X); //错误 }错误:不…...

OpenHarmony Meetup北京站招募令
OpenHarmony Meetup城市巡回北京站火热来袭!!日期:2023年11月25日14:00地点:中国科学院软件园区五号楼B402与OpenHarmony技术大咖近距离互动,分享技术见解,结交志同道合的朋友!活动主题聚焦Open…...

C语言——冒泡排序
一、冒泡排序是什么 冒泡排序: 冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。升序时:它会遍历若干次需要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大&#x…...

08.智慧商城——购物车布局、全选反选、功能实现
01. 购物车 - 静态布局 基本结构 <template><div class"cart"><van-nav-bar title"购物车" fixed /><!-- 购物车开头 --><div class"cart-title"><span class"all">共<i>4</i>件商品…...

金属压块液压打包机比例阀放大器
液压打包机是机电一体化产品,主要由机械系统、液压控制系统、上料系统与动力系统等组成。整个打包过程由压包、回程、提箱、转箱、出包上行、出包下行、接包等辅助时间组成。市场上液压打包机主要分为卧式与立式两种,立式废纸打包机的体积比较小…...

python 自动化福音,30行代码手撸ddt模块
用 python 做过自动化的小伙伴,大多数都应该使用过 ddt 这个模块,不可否认 ddt 这个模块确实挺好用,可以自动根据用例数据,来生成测试用例,能够很方便的将测试数据和测试用例执行的逻辑进行分离。 接下来就带大家一起…...

基于GATK流程化进行SNP calling
在进行变异检测时,以群体基因组重测序数据为例,涉及到的个体基本都是上百个,而其中大多数流程均是重复的步骤。 本文将基于GATK进行SNP calling的流程写入循环,便于批量分析。 1 涉及变量 1.工作目录work_dir/ 2.参考基因组ref…...

【Java SE】如何解读Java的继承和多态的特性?
前言 什么是继承和多态,为什么被称为Java三大特性,这两大特性为我们程序员带来了什么影响呢?是让复杂的代码简化了,还是为程序员写代码提供了多样性呢?那让我们一起来揭开这层神秘的面纱吧! 1.继承 1.1为…...

uniapp 手动调用form表单submit事件
背景: UI把提交的按钮弄成了图片,之前的button不能用了。 <button form-type"submit">搜索</button> 实现: html: 通过 this.$refs.fd 获取到form的vue对象。手动调用里面的_onSubmit()方法。 methods:…...

11月20日星期一今日早报简报微语报早读
11月20日星期一,农历十月初八,早报微语早读。 1、T1以3-0横扫WBG,拿下S13冠军!Faker豪取第4冠; 2、天舟七号货运飞船已运抵文昌发射场,将于明年初发射; 3、“中韩之战”球票已经售罄…...

Unity中 Start和Awake的区别
Awake和Start在Unity中都是MonoBehaviour脚本中的生命周期函数 Awake函数在游戏对象首次被加载时调用,在游戏对象初始化之前调用。 start函数在游戏对象初始化完成后调用,在update第一次执行前调用。 这两个函数在其生命周期内都只会调用一次…...
进度条、git常见指令以及gdb的常用指令
进度条 进度条是笔者所接触的第一个更加贴近于系统的小玩意,主要是要理解回车、换行、换行回车和缓冲区的概念。 回车是回到当前行的第一个光标位置,换行是换到下一行但是光标还在原来的位置,换行回车就是键盘上面的回车键是回到下一行的第…...
ubuntu20编译安装pkg-config
从下载到安装的步骤如下: wget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.tar.gztar -zxvf pkg-config-0.29.tar.gzcd pkg-config-0.29/./configure --with-internal-glibsudo makesudo make checksudo make install make过程中可能会遇到的问题&#x…...
奇富科技发布鸿蒙元服务1.0版本,打造鸿蒙生态金融科技全新体验
近日,奇富科技率先发布鸿蒙元服务1.0版本,成为首家融入鸿蒙生态的金融科技公司,为用户带来前所未有的数字生活体验。此次与华为终端云的全面合作,是两大行业领军者的深度融合,不仅实现技术的交融,更彰显两大…...

【Git学习一】初始化仓库git init的使用和提交git add与git commit的使用
😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:Git等软件工具技术的使用 👐学习格言:成功不是终点,失败也并非末日,最重要…...

Redux-状态管理组件
一、简介 react中的状态只属于某个组件。而Redux是一个全局管理js状态的架构,让组件通信更加容易。 之前是状态在所有组件间传递,而redux通过store来实现这个功能。 Redux特性: 1.Single source Of truth,通过store唯一维护状态…...

【bigo前端】egret中的对象池浅谈
本文首发于:https://github.com/bigo-frontend/blog/ 欢迎关注、转载。 egret是一款小游戏开发引擎,支持跨平台开发,之前使用这款引擎开发了一款捕鱼游戏,在这里简单聊下再egret中关于对象池的使用,虽然该引擎已经停止…...

用公式告诉你 现货黄金投资者要不要换策略?
看过笔者相关文章的朋友都知道,其实笔者是相当不鼓励投资者更改策略的。但这并不意味着,策略不能改或者换。之所以反对更改策略,是因为很多人对自己的策略还没上手,没了解清楚就急着换策略,这是没必要的。通过下面这个…...

Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...
【Pandas】pandas DataFrame dropna
Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值(NaN)DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充(即“下一个有效观测值”)…...

Heygem50系显卡合成的视频声音杂音模糊解决方案
如果你在使用50系显卡有杂音的情况,可能还是官方适配问题,可以使用以下方案进行解决: 方案一:剪映替换音色(简单适合普通玩家) 使用剪映换音色即可,口型还是对上的,没有剪映vip的&…...
【免杀】C2免杀技术(十五)shellcode混淆uuid/ipv6/mac
针对 shellcode 混淆(Shellcode Obfuscation) 的实战手段还有很多,如下表所示: 类型举例目的编码 / 加密XOR、AES、RC4、Base64、Poly1305、UUID、IP/MAC改变字节特征,避开静态签名或 YARA结构伪装PE Stub、GIF/PNG 嵌入、RTF OLE、UUID、IP/MAC看起来像合法文件/数据,弱…...

【RabbitMQ】- Channel和Delivery Tag机制
在 RabbitMQ 的消费者代码中,Channel 和 tag 参数的存在是为了实现消息确认机制(Acknowledgment)和精细化的消息控制。 Channel 参数 作用 Channel 是 AMQP 协议的核心操作接口,通过它可以直接与 RabbitMQ 交互: 手…...
Asp.net Core 通过依赖注入的方式获取用户
思路:Web项目中,需要根据当前登陆的用户,查询当前用户所属的数据、添加并标识对象等。根据请求头Authorization 中token,获取Redis中存储的用户对象。 本做法需要完成 基于StackExchange.Redis 配置,参考:…...

详解ZYNQ中的 RC 和 EP
详解ZYNQ中的 RC 和 EP 一、ZYNQ FPGA 开发板基础( ZC706 ) 1. 核心特点 双核大脑 灵活积木: ZC706 集成了 ARM Cortex-A9 双核处理器(相当于电脑 CPU)和 FPGA 可编程逻辑单元(相当于可自定义的硬件积木…...
Qt Quick模块功能及架构
Qt 6.0 中的 Qt Quick 模块是构建现代、动态用户界面的核心框架,基于声明式编程(QML)和 JavaScript,专注于高性能、流畅的动画和跨平台 UI 开发。、 一、主要功能改进 1. Qt Quick 核心架构 QML 引擎升级:Qt 6.0 使用…...
编程笔记---问题小计
编程笔记 qml ProgressBar 为什么valuemodel.progress / 100 在QML中,ProgressBar的value属性用于表示进度条的当前进度值,其范围通常为0到1(或0%到100%)。当使用model.progress / 100来设置value时,这样做的原因是为…...

机器学习——随机森林算法
随机森林算法是一种强大的树集成算法,比使用单个决策树效果要好得多。 以下是生成树集成的方法:假设有一个大小为m的训练集,然后对于b1到B,所以执行B次,可以使用有放回抽样来创建一个大小为m的训练集。所以如果有10个…...