设计模式 - 单例模式学习笔记

单例模式是一种设计模式,确保类只有一个实例,并提供全局访问点。常见应用包括回收站、日志管理、数据库连接池等,能节省资源和简化访问。然而,它可能导致对象无法变化、资源浪费和线程安全问题。实现方式包括饿汉式(类装载时实例化)和懒汉式(延迟加载)。懒汉式需注意线程安全,通常采用双重加锁机制。
摘要由CSDN通过智能技术生成

什么是单例模式?

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在,并提供一个访问它的全局访问点。
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

为什么要用单例模式

1、节省公共资源
windows系统的回收站就是使用单例模式的经典案例。当我们打开回收站窗口后,重新点击回收站快捷键,系统不会再弹出一个新的回收站的窗口。试想一下,若允许弹出多个回收站窗口,系统肯定是创建了多个回收站实例,只要是创建新的实例,系统就需要为其分配资源。若创建一个实例需要分配很多资源,创建多个对系统来说是个很大的负担。而在实际应用过程中,回收站间的资源又是共享的,也就是说,系统需要承受它本不需要承受的负担。若真的这样,系统会生气,崩溃给你看,就问你承受得起不~
其他经典案例还有日志管理、打印机、数据库连接池、应用配置等。
2、需要生成唯一序列的环境
网站的计数器,一般也是采用单例模式实现。如果存在多个计数器,每一个用户的访问都刷新计数器的值,那么计数就会乱七八糟,难以同步。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制。
3、方便资源相互通信的环境
例如一个C/S模式应用程序的配置文件(存储一些共有的后台数据或者默认参数),若不使用单例模式,在软件初始化初期,一定会需要将存储后台文件的对象指针在各个类之间传递,也就是说,只要是需要使用这些参数的类,都需要专门有一个传递指针的函数。对于功能稍微复杂的程序,这样的写法,真的会让程序员时刻处在崩溃的边缘。
4、需要频繁实例化然后销毁的对象。 比如管理学院首页页面缓存。
5、创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 比如上文所说的windows系统的回收站。

单例模式的优缺点

优点:
1、在内存中只有一个对象, 节省内存空间
2、避免频繁的创建销毁对象,可以提高性能
3、避免对共享资源的多重占用,简化访问;
4、为整个系统提供一个全局访问点
缺点:
1、 不适用于变化频繁的对象;
2、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
3、如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失(该点有待确认);
4、没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

单例模式的实现

1、饿汉式
优点:
在类装载的时候就完成实例化,避免了线程同步问题。
缺点:
在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

2、懒汉式
单例实例被延迟加载,即只有在真正使用的时候才会实例化一个对象并交给自己的引用。这种写法起到了Lazy Loading的效果。但是如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。需要添加双重加锁机制来解决这个问题。

参考资料:
https://blog.csdn.net/qq_42809504/article/details/83063235?spm=1001.2014.3001.5506
https://www.runoob.com/design-pattern/singleton-pattern.html
https://www.cnblogs.com/xuwendong/p/9633985.html
https://www.cnblogs.com/cdlyy/p/12846098.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值