单例模式介绍
单例模式是一个比较简单的设计模式,同时也是挺有意思的一个模式,虽然看起来简单,但是可以玩出各种花样。比如 Java 当中的懒饿汉式单例等。
什么是单例
单例模式的定义:
Ensure a class only has one instance, and provide a global point of access to it.
简单来说,确保某一个类只有一个实例,且自行实例化并向整个系统提供。
单例模式的适用场景
提供一个全局的访问,且只要求一个实例,如应用的配置信息 创建一个对象比较耗费资源,如
数据库连接管理、文件管理、日志管理等 资源共享,如线程池 工具类对象(也可以直接使用静态常量或者静态方法) 要求一个类只能产生两三个实例对象,比如某些场景下,会要求两个版本的网络库实例,如公司内网和外网的网络库实例
单例模式的简单实现
Java 当中实现一个简单的单例:
public class Singleton {
private static Singleton sInstance;
/**
* 构造方法私有化
*/
private Singleton() {}
/**
* 提供获取唯一实例的方法
* @return 实例
*/
public static Singleton getInstance() {
if (sInstance == null) {
sInstance = new Singleton();
}
return sInstance;
}
}
优秀的单例模式设计
上面的单例模式实现简单,但会存在一些问题,比如它并不是一个线程安全的。通常在设计一个优秀的单例会参考以下 3 点:
延迟加载(懒加载) 线程安全 防止反射破坏
Java 中的单例模式回顾
刚才简单实现的单例就是延迟加载,即懒汉式,因为只有在调用getInstance()方法的时候才会去初始化实例,但是,同时也是线程不安全的,原因是在多线程的场景下,假如一个线程执行了if (sInstance == null),而创建对象是需要花费一些时间的,这时另一个线程也进入了if (sInstance == null)里并执行了 代码,这样,就会有两个实例被创建出来,而这显然并不是单例所期望的。