单例模式
定义
一个类只有一个实例对象
简介
- 意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点
- 主要解决问题
一个全局使用的类频繁的创建与销毁
- 何时使用
控制实例数目,节省系统资源
- 如何实现
判断系统是否已有这个单例,如果有,直接返回,如果没有,创建单例
- 优点
在内存里只有一个实例,减少了内存的开销
避免对共享资源的多重占用
- 缺点
没有接口
不能继承
- 使用场景
需要生成唯一序列的环境
需要频繁实例化然后销毁的对象
创建对象时耗时过多或消耗资源过多,但又经常用到的对象
方便资源相互通信的环境
工具类对象
频繁访问数据库或文件的对象
- 注意
单例类只能有一个实例
单例类必须自己创建自己的唯一实例
单例类必须给所有其它对象提供这一实例
实现方式
- 懒汉模式
优点:第一次调用才初始化,避免内存浪费
缺点:必须加锁才能保证单例,但加锁会影响效率
实例:
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 饿汉模式
优点: 没有加锁,执行效率会提高
缺点:类加载时就初始化,浪费内存
实例:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
- 双重校验锁(双检锁)模式
实例:
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
- 登记(静态内部类)模式
实例:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
- 枚举模式
实例:
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}