单例模式
2022-07-05 15:54:23 32 举报
AI智能生成
GoF之单例设计模式
作者其他创作
大纲/内容
定义
一个类只允许创建一个对象(或者实例)
参考文献
41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?
42 | 单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?
43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
使用场景
处理资源访问冲突
日志打印
全局唯一类
配置类对象
ID生成器
实现方式
饿汉式
线程安全
不支持延迟加载
占用内存不会释放
懒汉式
线程不安全
支持延迟加载
线程安全会加锁,导致效率低下
双重检测
低版本JDK存在重排序问题,加volatile关键字即可
高版本已解决该问题
线程安全,高效率,支持延迟加载
静态内部类
线程安全
只有当调用 getInstance() 方法时,SingletonHolder 才会被加载,这个时候才会创建 instance。instance 的唯一性、创建过程的线程安全性,都由 JVM 来保证
延迟加载
SingletonHolder 是一个静态内部类,当外部类 IdGenerator 被加载的时候,并不会创建 SingletonHolder 实例对象
枚举
线程安全
实例唯一
单例存在的缺点
不支持基于接口编程,对OOP的支持不友好
继承
单例类构造方法是private,不允许继承
多态
多态需要基于接口,可单例模式没有接口
抽象
单例类构造方法是private,不允许继承
单例会隐藏类之间的依赖关系
调用单例方法,并不知道该方法具体依赖了那些类,执行了那些操作,只有查看代码才知道
单例对代码的扩展性不好
从单例变到多例模式比较复杂
如从单数据源配置到多数据源配置
单例对代码的可测试性不友好
无法使用依赖注入,无能灵活的替换掉可测试类
多个测试用例共享一个单例对象,之间可能会互相影响
不支持有参构造
单例的替代方案
方案一
静态方法
依旧无法解决扩展性等问题
方案二
IOC容器
工厂模式
程序员自己保证,不靠谱
线程唯一
类似于ThreadLocal的实现
集群唯一
使用文件存储或者redis等第三方介质作为公共资源获取
0 条评论
下一页