您的位置:首页 > 编程语言 > C语言/C++

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

2012-08-02 13:46 169 查看
什么是局部单例模式呢?关于单例模式有很多介绍,局部单例模式强调局部,普通的单例模式是全局性的,全局只有一个实例,局部单例模式是指在某个范围内只有一个实例。

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

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

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

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

这有什么意义呢?

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

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

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

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

boost.asio库是局部单例的一个很好应用,也是c++语言实现局部单例模式的经典方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: