定义
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
使用场景
确保某各类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。例如,创建一个对象需要消耗的资源过多,例如需要访问数据库或者IO等资源。
实现关键点
- 构造函数不对外开放,一般为private;
- 通过一个静态方法或者枚举返回实例类对象;
- 确保单例类的对象有且只有一个,尤其是在多线程环境下;
- 确保单例类对象在反序列化时不会重新构建对象。
推荐的实现方式
-
Double Check Lock(DCL)实现单例
public class SingleTon {
private volatile static SingleTon sInstance = null;
private SingleTon() {}
public static SingleTon getInstance() {
if (sInstance == null) {
synchronized (SingleTon.class) {
if (sInstance == null) {
sInstance = new SingleTon();
}
}
}
return sInstance;
}
}
-
静态内部类单例模式
public class SingleTon {
private SingleTon() {}
public static SingleTon getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
private static final SingleTon sInstance = new SingleTon();
}
}
其他的实现方式
-
饿汉模式
public class SingleTon {
private static final SingleTon sInstance = new SingleTon();
private SingleTon() {}
public static SingleTon getInstance() {
return sInstance;
}
}
-
懒汉模式
public class SingleTon {
private static final SingleTon sInstance;
private SingleTon() {}
public synchronized static SingleTon getInstance() {
if (sInstance == null) {
sInstance = new SingleTon();
}
return sInstance;
}
}
-
枚举单例
public enum SingletonEnum {
INSTANCE;
}
-
容器实现
public class SingletonManager {
private static Map<String, Object> sObjMap = new HashMap<>();
private SingletonManager() {}
public static void registerService(String key, Object instance) {
if (!sObjMap.containsKey(key)) {
sObjMap.put(key, instance);
}
}
public static Object getService(String key) {
return sObjMap.get(key);
}
}