首页 > 其他分享 >请你谈谈单例模式的优缺点,注意事项,使用场景

请你谈谈单例模式的优缺点,注意事项,使用场景

时间:2023-03-17 09:03:39浏览次数:66  
标签:场景 该类 对象 优缺点 模式 实例 单例 注意事项

单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整体的行为。

单例模式实现思路

  • 一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);
  • 调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;
  • 将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

需要注意的地方

单例模式在多线程的,应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。

优点

  1. 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例
  2. 单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。
  3. 提供了对唯一实例的受控访问。
  4. 由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
  5. 允许可变数目的实例。
  6. 避免对共享资源的多重占用。

缺点

  1. 不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
  2. 由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
  3. 单例类的职责过重,在一定程度上违背了“单一职责原则”。
  4. 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

使用注意事项

  1. 使用时不能用反射模式创建单例,否则会实例化一个新的对象
  2. 使用懒单例模式时注意线程安全问题
  3. 饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承

适用场景

单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如:

  • 需要频繁实例化然后销毁的对象。
  • 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  • 有状态的工具类对象。-频繁访问数据库或文件的对象。

应用场景

  • Windows的Task Manager(任务管理器)就是很典型的单例模式。
  • Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
  • 网站的计数器,一般也是采用单例模式实现,否则难以同步。
  • 应用程序的日志应用,一般都是用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  • Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
  • 数据库连接池的设计一般也是采用单例模式。
  • 多线程的线程池的设计一般也是采用单例模式。

 

参考:

 

标签:场景,该类,对象,优缺点,模式,实例,单例,注意事项
From: https://www.cnblogs.com/xfeiyun/p/17225339.html

相关文章

  • go-zero开发注意事项
    随着go-zero和相关依赖包版本的更新,以下注意事项里提到的规则可能会有所不同,请注意! 1.配置jwt时,AccessSecret的长度必须大于8位,否则报错2.同一个项目的不同模块间,配置A......
  • 设计模式1——单例模式
    单例模式:在使用构造函数时,保证全局只有一个new出来的对象,后续无论如何调用,都是显示为第一次构造的对象;需更改内部属性,可以通过提供函数接口更改核心:确保只有一个实例,并......
  • less和sass优缺点对比
    1.编译难度sass: node-sass安装经常报错,而且与nodejs版本绑定,不再更新,dart-sass为纯js实现,性能待提升less:  编译容易,安装无压力2.语法2.1 循环sass有多种循环......
  • go语言中defer的注意事项
    defer介绍Go语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后......
  • Spring中的单例和多例的区别
    Spring中的单例和多例的区别https://blog.csdn.net/qq_41369135/article/details/1241034271,什么是单例和多例单例:所有请求用同一个对象来处理。通过单例模式,可以保证......
  • 跑腿APP定制开发注意事项
    为跑腿配送APP在开发过程中,定制开发除了做好相应的资金和研究准备工作外,还需要注意以下内容:1.保证稳定.运行环境顺畅一种跑腿配送APP如果你想在线成功定制开发并获得更多......
  • NAS通过Alist挂载公共云盘并用WebDAV本地加载的注意事项
    前言NAS采用Dock的方法,用Alist程序挂载阿里云盘后通过WebDAV加载使用,是一个很实用的需求,很好的实现了云端存储本地管理。关于NAS通过Alist挂载公共云盘,网上有很成熟的贴......
  • 「Go」 通过一个案例解释清楚 interface 的用法和注意事项
    Golang接口(interface)简介和入门使用如果在公众号文章发现状态为已更新,建议点击查看原文查看最新内容。状态:未更新原文链接:https://typonotes.com/posts/2......
  • Azure虚拟桌面专题之二十:删除主机池及其注意事项
       前面我们介绍了Azue虚拟桌面,以及相关的一些属性、操作、问题排查等等。本文将介绍本专题最后一个话题:删除主机池。​   在Azure虚拟桌面中创建的所有主机......
  • 单例模式
    常见设计模式工厂模式,代理模式,模板方法模式,责任链模式,单利模式项⽬⼿写代码⽤得⽐较多的,⼀般就模板⽅法模式、责任链模式、策略模式、单例模式吧 单例模式即某个类......