首页 > 其他分享 >Book-深入设计模式-单例模式

Book-深入设计模式-单例模式

时间:2023-03-05 20:15:08浏览次数:52  
标签:调用 实例 对象 模式 Book 单例 设计模式 构造函数

Book-深入设计模式-单例模式

https://refactoringguru.cn/design-patterns/singleton

单例模式
亦称: 单件模式、Singleton

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

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

  • 保证一个类只有一个实例。
  • 为该实例提供一个全局访问节点。

解决方案

所有单例的实现都包含以下两个相同的步骤:

  • 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符。
  • 新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象, 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。

如果你的代码能够访问单例类, 那它就能调用单例类的静态方法。 无论何时调用该方法, 它总是会返回相同的对象。

单例模式结构

![](.\singleton structure.png)
singleton structure

单例模式适合应用场景

  1. 如果程序中的某个类对于所有客户端只有一个可用的实例, 可以使用单例模式。
    单例模式禁止通过除特殊构建方法以外的任何方式来创建自身类的对象。 该方法可以创建一个新对象, 但如果该对象已经被创建, 则返回已有的对象。

  2. 如果你需要更加严格地控制全局变量, 可以使用单例模式。
    单例模式与全局变量不同, 它保证类只存在一个实例。 除了单例类自己以外, 无法通过任何方式替换缓存的实例。
    请注意, 你可以随时调整限制并设定生成单例实例的数量, 只需修改 获取实例方法, 即 getInstance 中的代码即可实现。

实现方式

  1. 在类中添加一个私有静态成员变量用于保存单例实例。

  2. 声明一个公有静态构建方法用于获取单例实例。

  3. 在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。

  4. 将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。

  5. 检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用。

单例模式优缺点

优点

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

缺点

  • 违反了单一职责原则。 该模式同时解决了两个问题。
  • 单例模式可能掩盖不良设计, 比如程序各组件之间相互了解过多等。
  • 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。
  • 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。 要么干脆不编写测试代码, 或者不使用单例模式。

与其他模式的关系

  • 外观模式类通常可以转换为单例模式类, 因为在大部分情况下一个外观对象就足够了。

  • 如果你能将对象的所有共享状态简化为一个享元对象, 那么享元模式就和单例类似了。 但这两个模式有两个根本性的不同。
    1.只会有一个单例实体, 但是享元类可以有多个实体, 各实体的内在状态也可以不同。
    2.单例对象可以是可变的。 享元对象是不可变的。

  • 抽象工厂模式、 生成器模式和原型模式都可以用单例来实现。

标签:调用,实例,对象,模式,Book,单例,设计模式,构造函数
From: https://www.cnblogs.com/yongchao/p/17181456.html

相关文章

  • Book-深入设计模式-原型模式
    Book-深入设计模式-原型模式https://refactoringguru.cn/design-patterns/prototype原型模式亦称:克隆、Clone、Prototype原型模式是一种创建型设计模式,使你能够复制......
  • Book-深入设计模式-生成器模式
    Book-深入设计模式-生成器模式https://refactoringguru.cn/design-patterns/builder生成器模式亦称:建造者模式、Builder生成器模式是一种创建型设计模式,使你能够分步......
  • Book-深入设计模式-抽象工厂模式
    Book-深入设计模式-抽象工厂模式https://refactoringguru.cn/design-patterns/abstract-factory抽象工厂模式亦称:AbstractFactory抽象工厂模式是一种创建型设计模式,......
  • Book-深入设计模式-工厂方法模式
    Book-深入设计模式-工厂方法模式https://refactoringguru.cn/design-patterns/factory-method工厂方法模式亦称:虚拟构造函数、VirtualConstructor、FactoryMethod工......
  • 《设计模式之禅》Strategy_Pattern--策略模式
    写在前面设计模式之禅这本书也是博主看了几本设计模式的开头才决定以这本书作为学习设计模式的资料。像小傅哥的重学Java设计模式,好处是以真实的项目案例的逻辑来搭配设计模......
  • Jupter Notebook 常见问题
    不会自动打开浏览器问题https://www.iotword.com/6147.html默认工作路径的设置https://www.cnblogs.com/yuyanc/p/16434487.html导入ipynb文件方法https://www.cnblog......
  • MacBook里从微信上下载文件后打开,都显示的只读模式,怎么解决?
    yds@ydsdeAir~%sudochmod-R755/Users/yds/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\Support/com.tencent.xinWeChat/可以修改微信文......
  • 设计模式篇之一文搞懂如何实现单例模式
    设计模式篇之一文搞懂如何实现单例模式大家好,我是小简,这一篇文章,6种单例方法一网打尽,虽然单例模式很简单,但是也是设计模式入门基础,我也来详细讲讲。DEMO仓库:https://gi......
  • MacBookPro安装Windows10单系统的4个小坑
    MacbookPro安装Windows10 从入门到精通0、前言:一个朋友买了MacBookPro一直用Mac系统,因为工作原因经常涉及到Office的一些功能,使用起来多有不便于是让我帮忙看看......
  • 单例模式
    classSingleton{privateSingleton(){}privatestaticvolatileSingletonsingleton=null;publicstaticSingletongetInstance(){if......