释义
单例模式:某一个类有且只有一个实例存在,而且自行实例化,并向整个运行环境提供这个唯一实例;
使用场景
此设计模式是应用最广的模式之一;
- 创建该类需要消耗太多的资源 : 网络请求
- 某种类型的对象只应该有且只有一个 :数据库的访问
一般约定
通用的单例类的编写规则
- 私有化构造方法:构造方法一般为Private
- 定义私有类变量为类为类对象,用于保存实例
- 通过公有静态方法获取类变量的值:即类的实例
要求:
- 确保单例对象有且只有一个,尤其是多线程的情况下
- 确保单例对象在反序列化时实例唯一
单例的模式的写法
饿汉式单例
在类被声明静态变量时即被初始化赋值
优点:编写简单,线程安全
缺点:在声明时就初始化,如果不使用,就造成了资源浪费
public class HungrySingleton {
// 私有内部变量持有类对象.
private static final HungrySingleton INSTANCE = new HungrySingleton();
// 私有化构造方法
private HungrySingleton() {
}
// 共有静态方法获取实例.
public static HungrySingleton getInstance() {
return INSTANCE;
}
}
懒汉式单例
public class LazySingleton {
private static LazySingleton INSTANCE;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (null == INSTANCE) {
INSTANCE = new LazySingleton();
}
return INSTANCE;
}
}
双重校验锁式单例
public class DoubleCheckLockSingleton {
private static DoubleCheckLockSingleton instance;
private DoubleCheckLockSingleton() {
}
public static DoubleCheckLockSingleton getInstance() {
if (null == instance) {
synchronized (DoubleCheckLockSingleton.class) {
if (null == instance) {
instance = new DoubleCheckLockSingleton();
}
}
}
return instance;
}
}
静态内部类单例
public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {
}
public StaticInnerClassSingleton getInstance() {
return SingletonHolder.instance;
}
/**
* 静态内部类.
*/
private static class SingletonHolder {
private static StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
}
}
枚举单例
public enum EnumSingleton {
INSTANCE;
}