系列文章目录
设计模式概述
创建型模式-单例模式
创建型模式-原型模式
创建型模式-工厂方法模式
创建型模式-抽象工厂模式
创建型模式-建造者模式
单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
解决问题
单例模式同时解决了两个问题, 所以违反了单一职责原则:
- 保证一个类只有一个实例。
- 为该实例提供一个全局访问节点。
如今, 单例模式已经变得非常流行, 以至于我们有时会仅仅为了解决全局访问节点这个问题,而选择单例。
应用场景
保证一个类只有一个实例
- 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接。
- 要求生成唯一序列号的环境
提供全局访问节点
- 在整个项目中需要一个共享访问点或者共享数据的时候
- 需要定义大量的静态常量和静态方法的环境
实现
- 在类中添加一个私有静态成员变量用于保存单例实例。
- 声明一个公有静态构建方法用于获取单例实例。
- 在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
- 将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。(对于Objective-C而言,其他类能绕过静态方法,直接通过初始化该类,来破坏单例模式)
- 检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。
优缺点
✅ 你可以保证一个类只有一个实例
✅ 你获得了一个指向该实例的全局访问节点
✅ 仅在首次请求单例对象时对其进行初始化
❌ 违反了单一职责原则
❌ 违背了迪米特原则(最少知道原则)
❌ 无法继承,也就无法扩展,违背了开闭原则、依赖倒置原则
❌ 无法继承也就无法mock,难以实现单元测试
总结
由谁创建(Who) :单例类自己
创建什么(What) :该类在系统中唯一的实例
何时创建(When): Objective-C常规的都是懒加载,java则存在多种选择
实践讨论
- iOS 中的单例模式,为何如此简单粗暴?
- 官方的框架,比如 Cocoa,存在哪些单例类?我们自己的项目中又存在哪些单例类?
- 我们项目中的单例类的存在,是为了解决什么问题,是否真的需要使用单例模式?
参考资料
- 《设计模式的艺术》作者:刘伟
- 网站:https://refactoringguru.cn/design-patterns