定义
Ensure a class has only one instance, and provide a global point of access to it.
使用场景
要求一个类有且只有一个对象。具体场景如下:
* 要求生成唯一序号的环境。
* 需要共享访问点或者共享数据,要求线程安全。
* 创建对象消耗资源过多,如 IO ,数据库资源等。
* 需要定义大量静态常量或静态方法的环境,如工具类。
UML
示例
类构造器对其他类不可见,仅提供获取唯一一个实例的静态方法。
饿汉模式
public class Singleton {
private static final Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
懒汉模式
懒汉方式
// 仅适用于单线程
public class Singleton2 {
private static Singleton2 singleton2 = null;
private Singleton2(){}
public static Singleton2 getInstance(){
if(singleton2 == null){
singleton2 = new Singleton2();
}
return singleton2;
}
}
DCL
public class Singleton3 {
// Java 编译器允许处理器乱序执行,会有 DCL 失效的问题
// JDK 1.5 后,优化了 volatile 。保证执行顺序,但会影响性能。
private static volatile Singleton3 singleton3 = null;
private Singleton3(){}
public static Singleton3 getInstance(){
if(singleton3 == null){
synchronized (Singleton3.class){
if(singleton3 == null){
singleton3 = new Singleton3();
}
}
}
return singleton3;
}
}
静态内部类
public class Singleton4 {
private Singleton4(){}
public static final Singleton4 getInstance(){
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder{
private static final Singleton4 INSTANCE = new Singleton4();
}
}
优点
- 减少内存开支。
- 避免对资源的多重占用。
- 设置全局访问点
局限
- 一般没有接口,扩展困难。
- 对测试不利。
- 与单一职责原则有冲突。
参考
腾讯Bugly:https://mp.weixin.qq.com/s/wEK3UcHjaHz1x-iXoW4_VQ
END ~