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

Class01.单例设计模式

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

一、单例设计模式的概念

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 {
private 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 {
	private 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),所以这种性能不足是几乎可以忽略的,这种方法相对来说算是非常完美的方法。(无法解决反序列化的风险)

特别注意1:实例对象必须加上volatile,以此来避免语句重排时所带来的问题
特别注意2:INSTANCE必须private,否则会带来在没有初始化就被直接调用的风险

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;
}
}
--------------------------------
其他的功能方法
--------------------------------
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值