创建型模式-单例模式

系列文章目录

设计模式概述
创建型模式-单例模式
创建型模式-原型模式
创建型模式-工厂方法模式
创建型模式-抽象工厂模式
创建型模式-建造者模式



单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

解决问题

单例模式同时解决了两个问题, 所以违反了单一职责原则:

  1. 保证一个类只有一个实例。
  2. 为该实例提供一个全局访问节点。
    如今, 单例模式已经变得非常流行, 以至于我们有时会仅仅为了解决全局访问节点这个问题,而选择单例。

应用场景

保证一个类只有一个实例

  • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接。
  • 要求生成唯一序列号的环境

提供全局访问节点

  • 在整个项目中需要一个共享访问点或者共享数据的时候
  • 需要定义大量的静态常量和静态方法的环境

实现

在这里插入图片描述

  1. 在类中添加一个私有静态成员变量用于保存单例实例。
  2. 声明一个公有静态构建方法用于获取单例实例。
  3. 在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。
  4. 将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。(对于Objective-C而言,其他类能绕过静态方法,直接通过初始化该类,来破坏单例模式)
  5. 检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。

优缺点

✅ 你可以保证一个类只有一个实例
✅ 你获得了一个指向该实例的全局访问节点
✅ 仅在首次请求单例对象时对其进行初始化

❌ 违反了单一职责原则
❌ 违背了迪米特原则(最少知道原则)
❌ 无法继承,也就无法扩展,违背了开闭原则、依赖倒置原则
❌ 无法继承也就无法mock,难以实现单元测试

总结

由谁创建(Who) :单例类自己
创建什么(What) :该类在系统中唯一的实例
何时创建(When): Objective-C常规的都是懒加载,java则存在多种选择

实践讨论

  1. iOS 中的单例模式,为何如此简单粗暴?
  2. 官方的框架,比如 Cocoa,存在哪些单例类?我们自己的项目中又存在哪些单例类?
  3. 我们项目中的单例类的存在,是为了解决什么问题,是否真的需要使用单例模式?


参考资料

  1. 《设计模式的艺术》作者:刘伟
  2. 网站:https://refactoringguru.cn/design-patterns
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值