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