局部单例模式以及C++实现

本文深入探讨了局部单例模式的概念及其在软件设计中的应用价值,特别是如何通过局部单例模式来避免全局单例带来的耦合问题,减少内存泄漏风险,并在多模块系统中实现更好的隔离效果。同时,通过Java和Boost.Asio库的实例分析,展示了局部单例模式在实际编程实践中的应用与优势。

什么是局部单例模式呢?关于单例模式有很多介绍,局部单例模式强调局部,普通的单例模式是全局性的,全局只有一个实例,局部单例模式是指在某个范围内只有一个实例。

局部单例模式其实有很多例子,比如在一个操作系统基础上,每个进程有自己的虚拟内存池,有自己的内核句柄集合,但是共享一个CPU,这里CPU是全局单例的,而虚拟内存池,内核句柄集合是局部单例的。

需要说明的是,单例有一个特性,是延迟创建,只在第一次使用时才创建单例。因此上面的例子还不算严格的单例。

局部单例模式有什么用呢?通过上面的例子,我们不难发现,局部单例模式最大的优点在于解耦合,对于某个类型的对象,每个子系统有自己的一个独立实例,这些子系统就不会相互影响。

从操作系统的讨论回到我们自己写的程序上,你也许会说:我们的进程中的全局单例在整个系统中就是一个局部单例啊。不错,进程其实已经很好的隔离了对象,我们这里要讨论的是在一个进程内的多个子模块中实现局部单例。

这有什么意义呢?

我们现在的大型软件都依赖了很多第三方库,我们也会提供自己的库给别人使用,如果库的提供者滥用全局单例(C++中应该是函数静态变量实现),作为库的使用方你不觉得很难受吗。这些全局单例会一直生存到进程退出的时候,占用内存不说,在进程退出时要销毁这些全局单例,还指不定会出什么问题,因为进程退出时的状态比较特殊。我们有些程序正常运行中没有问题,但是一旦退出的时候就crash,很大比例的原因就在于没有处理好全局单例的销毁。

还有,如果有两个模块(你负责其中一个)都使用了第三个模块,而第三个模块里面有一个全局单例,你不觉得心惊胆战吗,你是否要与另一个模块小心处理访问同步。

另一方面,作为库的提供者,如果不使用全局单例,你的工作会轻松很多,你不需要担心使用者的调用方式是否满足要求,不需要小心处理线程间同步,也不需要关心程序退出时的特殊环境问题。

可以了解一下Java,Java中是没有全局对象的,但是可以定义属于类型的属性,可是这不是局部单例。

boost.asio库是局部单例的一个很好应用,也是c++语言实现局部单例模式的经典方案。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值