模式动机
系统中资源存在浪费的情况下,考虑如何缩减程序占用内存大小,对于多次使用到的对象通过多次复用来达到减少生成对象的消耗,使得系统运行期间只有该类的一个实例对象,并且系统能够访问到该实例对象。
模式组成
单例模式就就一个角色即单例,单例类中包含一个指向它自己实例对象的成员变量。
单例模式确保了某一个类只要有实例,而且自行实例化并向系统提供这个实例,单例类提供了全局访问的方法。
Java实现
一般的分为懒汉式和饿汉式,以下给出常见的懒汉式三种实现:
public class DoubleCheckSingleton {
// 防止实例时重排序
private static volatile DoubleCheckSingleton doubleCheckSingleton;
// 保证该类不能被实例化
private DoubleCheckSingleton() {
}
public static DoubleCheckSingleton getInstance() {
if (doubleCheckSingleton == null) {
synchronized (DoubleCheckSingleton.class) {
if (doubleCheckSingleton == null) {
doubleCheckSingleton = new DoubleCheckSingleton();
}
}
}
return doubleCheckSingleton;
}
}
public class InnerSingleton {
//访问外部属性不会初始化内部类
private InnerSingleton() {}
private static class Inner {
private static InnerSingleton innerSingleton = new InnerSingleton();
}
public static InnerSingleton getInstance() {
return Inner.innerSingleton;
}
}
public class EnumSingleton {
private EnumSingleton(){
}
/**
* 枚举中常量
*/
private enum Singleton {
SINGLETON;
private EnumSingleton enumSingleton;
Singleton() {
this.enumSingleton = new EnumSingleton();
}
public EnumSingleton getEnumSingleton() {
return enumSingleton;
}
}
public static EnumSingleton getInstance(){
return Singleton.SINGLETON.getEnumSingleton();
}
}
单例模式的缺点
- 不满足单一职责的原则,单个类负责创建对象又负责对象创建方式,职责过重。
- 如果生成的实例很长时间没有被使用,由于Java虚拟机垃圾自动回收机制,将导致实例对象被回收。