编程语言
首页 > 编程语言> > java23设计模式---class01.单例设计模式

java23设计模式---class01.单例设计模式

作者:互联网

Class01.单例设计模式

写在前面:最近重温设计模式,所以决定在学习的同时也把笔记发在csdn以便加深印象和之后复习。在学习单例这种设计模式之前,我们或多或少已经和它打过交道,诸如LocalDateTime.now(),在学习这个调用方法时,或许大家都会有疑惑,为什么只能调用不能构造呢?为什么要把构造方法私有化呢?这样做有什么好处呢?学完单例设计模式,或许你就会找到想要的答案。本文会概述单例设计模式的概念和意义,主要在文中再现常见的单例实现方法。最后,由于我学习java的时间较短,所以可能也难免观点会比较片面甚至出现错误,欢迎大家在评论区中指出。

文章目录

一、单例设计模式的概念

1、单例设计模式是什么

类的对象只有一个

2、单例设计模式的意义

节省系统资源,且外部易于访问

3、单例设计模式的实现

①class构造方法私有化 ②使用枚举类enum(官方推荐)

二、单例设计模式的代码实现

说明:单例设计的方法其实是多种多样的,所以我根据网上对这些写法的评价和自己的判断选取了几种常用的、优秀的设计方法写在了这里

1、枚举单例(推荐)

个人认为,这是最完美的单例方法,其是本文列举的方法中唯一做到避免反序列化的方法

public enum Ways06 {
INSTANCE;
--------------------------------
其他的功能方法
--------------------------------
}

2、最常见的方法(推荐)

package singleton_Pattern;

public class Ways02 {
static final Ways02 INSTANCE=new Ways02();
private Ways02(){}//私有化构造函数
public static Ways02 getInstance() {
	return INSTANCE;
}
--------------------------------
其他的功能方法
--------------------------------
}

方法介绍:此类方法很简单,且线程安全(JVM保证),使用较广,不足的是:①类加载到内存中就实例化该类的单例对象,在单例对象未被使用前,都会造成系统资源的浪费。②反序列化可以破解此方法构建的单例模式

3、懒汉式

1)

public class Ways03 {
static Ways03 INSTANCE;	
private Ways03() {
	
}
public static Ways03 getInstance() {
	if(INSTANCE==null)//标记1
		INSTANCE=new Ways03();
	return INSTANCE;
}
--------------------------------
其他的功能方法
--------------------------------
}

注意:线程不安全!!!一旦在上面代码标记1处(if(INSTANCE==null))执行完毕切换了线程片,就会出现多个实例!

测试方法推荐:可以使它在标记1处执行完后sleep,然后通过hashcode来验证即可。

2)改进

public class Ways04 {
	static volatile Ways04 INSTANCE;	
	private Ways04() {
		
	}
	public static Ways04 getInstance() {
		if(INSTANCE==null)
			synchronized(Ways04.class) {
				if(INSTANCE==null) //注意,这个判断一定要有
			INSTANCE=new Ways04();}
		return INSTANCE;
}
--------------------------------
其他的功能方法
--------------------------------
}

说明:用锁去解决了线程不安全的问题,虽说锁会带来性能上的不足,但是此方法中用锁锁住的是一个代码块,而且是否会用到锁还取决于第一次if(INSTANCE==null),所以这种性能不足是几乎可以忽略的,这种方法相对来说算是非常完美的方法。(无法解决反序列化的风险)

特别注意:实例对象必须加上volatile,以此来避免语句重排时所带来的问题

4.懒加载

说明:静态内部类方法,JVM保证了在加载外部类时并不会加载内部类,所以以此来改进方法1就可以实现非常完美的单例方法。(无法解决反序列化的风险)

public class Ways05 {
private Ways05() {}
private static class Ways05_1{
	static final Ways05 INSTANCE=new Ways05();
}
static Ways05 getInstance() {
	return Ways05_1.INSTANCE;
}
}
--------------------------------
其他的功能方法
--------------------------------

标签:--------------------------------,java23,---,INSTANCE,static,单例,设计模式,方法
来源: https://blog.csdn.net/m0_51801058/article/details/113431963