• 创建型模式-单例模式


    系列文章目录

    设计模式概述
    创建型模式-单例模式
    创建型模式-原型模式
    创建型模式-建造者模式



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

    解决问题

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

    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
  • 相关阅读:
    Linux通过QQ邮箱账号使用mailx发送邮件
    Android通过jni调用本地c/c++接口方法总结
    JavaScript快速入门
    java - 七大比较排序 - 详解
    Python使用SQLAlchemy操作sqlite
    10.Java集合汇总
    docker(2)部署前后端分离springboot+vue项目
    出行生态布局初显!魅族董事长沈子瑜:Flyme系统明年“上车”
    对mysql的联合索引的深刻理解
    【黑马程序员】MySQL学习记录二(SQL)案例
  • 原文地址:https://blog.csdn.net/u011303816/article/details/125895688