设计模式 之 单例模式

 我来答
粘致0gh
2022-08-16 · TA获得超过9507个赞
知道小有建树答主
回答量:355
采纳率:100%
帮助的人:84万
展开全部

1. 定义

单例模式指的是一个类,在全局范围内(整个系统中)有且只能有一个实例存在。即该类本身负责提供一种访问其唯一对象的方式,不对外提供公共的构造函数(禁用默认公共构造函数),对于该类的实例化由它自己在类的内部进行维护!

2. 优缺点

- 优点

1. 最大程度的减少了对象的创建和销毁的次数,从而降低的垃圾回收的次数

2. 节约了系统资源,尤其是内存资源

- 缺点

1. 不能继承,不能被外部实例化

2. 类干预了外部类的使用(外部实用类不能随意实例化),而不再仅仅专注于内部的逻辑(与单一职责模式有矛盾)

3. 使用场景

- 有频繁的实例化后又销毁的情况,适合考虑使用单例模式,如记录日志的log对象

- 创建对象需要消耗过多的系统资源,但又经常用到的资源,如数据库连接

4. 框架中的应用

5. 实现方式

单例模式有多种实现方式,要考虑到多线程下的安全性,其每种实现方式如下所示:

以上方式,如果存在多个线程同时访问getInstance()时,由于没有锁机制,会导致实例化出现两个实例的情况,因此,在多线程环境下时不安全的。

如上代码所示,在getInstance()方法上添加了同步锁。但是该方法虽然解决了线程安全的问题,但却也带来了另外的一个问题,就是每次获取对象时,都要先获取锁,并发性能很差,还需要继续优化!

该方法将方法上的锁去掉了,避免了每次调用该方法都要获取锁的操作,从而提升了并发性能,同时在方法内部使用锁,进而解决了并发的问题,从而解决了上面**并发安全+性能低效**的问题,是个不错的实现单例的方式。

该方式虽然简单也安全,但是会造成再不需要实例时,产生垃圾对象,造成资源狼粪,因此,一般不使用。

这种方式可以达到跟** 双重校验锁 **一样的效果,但只适用于静态域的情况,双重校验锁可在实例域需要延迟初始化时使用

这是实现单例模式的最佳方法,更加简洁,自动支持序列化,防止多次实例化,非常高效! (强烈推荐使用)

6.引用

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柚鸥ASO
2024-03-16 广告
「柚鸥ASO」在ASO这块就做的蛮不错的,一直专注于应用商店优化,因为专注所以专业;专注应用商店下载量优化、评分优化、关键词排名优化、关键词覆盖、产品权重提升等等整体方案优化服务柚鸥网络-全球ASO优化服务商专注ASO优化已11年!(效果说... 点击进入详情页
本回答由柚鸥ASO提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式