Author:赵志乾
Date:2019-03-09
Declaration:All Right Reserved!!!
1、模式解释
所谓单例模式,是指在进程运行期间,不通过反射方式,实例化代码被集中一处且仅被调用一次的类设计理念。
我们知道,对于普通类设计理念,其在进程运行期间,我们可以按照具体需求在内存空间中构建所需数量的实例。然后协调各实例之间的协作,完成应用功能。
实际应用中,存在这样一种场景:在进程运行期间,某种类的实例至多存在一份。为了满足这一诉求,我们可以在代码层面谨慎处理,由开发人员自行保证该类仅被实例化一次。对于小型项目而言,或许可行,但在大规模系统中,往往难以保证。于是便出现了单例模式这一类设计理念,其通过固化的设计方式,将实例化代码集中一处且确保仅被执行一次,从而降低开发人员出错的可能性。
2、模式补充
通常谈到单例模式,我们便会脱口而出:进程运行期间,类的实例仅存在一份。其实这种说法不完全正确。个人认为单例模式的核心是集中实例化代码并保证代码仅被执行一次,有时单例模式可能要求进程中至多存在类的3个实例,从而实现负载均摊。所以单例模式可以换一种解释:类的实例化代码被集中一处,在进程运行期间,指定允许存在实例的上限数目并且一次性初始化所有实例。
3、经典实现
类的UML图
代码实现:
package com.zhaozhiqian;
// 单例模式
public class Singleton {
// 1、使用类字段存放进程内存空间中构建的实例引用
// 2、实例化代码被集中一处,且在类加载时执行一次
private static Singleton singleton= new Singleton();
// 3、构造函数私有化,防止误调用导致的额外实例化
private Singleton(){
System.out.println("初始化实例完成!");
}
// 4、使用类方法获取进程内存空间中构建的实例引用
public static Singleton getInstance(){
return singleton;
}
}
package com.zhaozhiqian;
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println("singleton1="+singleton1);
System.out.println("singleton2="+singleton2);
}
}
输出结果如下,可以看出两次获得的是同一个实例。
初始化实例完成!
singleton1=com.zhaozhiqian.Singleton@21bcffb5
singleton2=com.zhaozhiqian.Singleton@21bcffb5
参考资料:《图解设计模式》