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