局部单例模式以及C++实现
2012-08-02 13:46
169 查看
什么是局部单例模式呢?关于单例模式有很多介绍,局部单例模式强调局部,普通的单例模式是全局性的,全局只有一个实例,局部单例模式是指在某个范围内只有一个实例。
局部单例模式其实有很多例子,比如在一个操作系统基础上,每个进程有自己的虚拟内存池,有自己的内核句柄集合,但是共享一个CPU,这里CPU是全局单例的,而虚拟内存池,内核句柄集合是局部单例的。
需要说明的是,单例有一个特性,是延迟创建,只在第一次使用时才创建单例。因此上面的例子还不算严格的单例。
局部单例模式有什么用呢?通过上面的例子,我们不难发现,局部单例模式最大的优点在于解耦合,对于某个类型的对象,每个子系统有自己的一个独立实例,这些子系统就不会相互影响。
从操作系统的讨论回到我们自己写的程序上,你也许会说:我们的进程中的全局单例在整个系统中就是一个局部单例啊。不错,进程其实已经很好的隔离了对象,我们这里要讨论的是在一个进程内的多个子模块中实现局部单例。
这有什么意义呢?
我们现在的大型软件都依赖了很多第三方库,我们也会提供自己的库给别人使用,如果库的提供者滥用全局单例(C++中应该是函数静态变量实现),作为库的使用方你不觉得很难受吗。这些全局单例会一直生存到进程退出的时候,占用内存不说,在进程退出时要销毁这些全局单例,还指不定会出什么问题,因为进程退出时的状态比较特殊。我们有些程序正常运行中没有问题,但是一旦退出的时候就crash,很大比例的原因就在于没有处理好全局单例的销毁。
还有,如果有两个模块(你负责其中一个)都使用了第三个模块,而第三个模块里面有一个全局单例,你不觉得心惊胆战吗,你是否要与另一个模块小心处理访问同步。
另一方面,作为库的提供者,如果不使用全局单例,你的工作会轻松很多,你不需要担心使用者的调用方式是否满足要求,不需要小心处理线程间同步,也不需要关心程序退出时的特殊环境问题。
可以了解一下Java,Java中是没有全局对象的,但是可以定义属于类型的属性,可是这不是局部单例。
boost.asio库是局部单例的一个很好应用,也是c++语言实现局部单例模式的经典方案。
局部单例模式其实有很多例子,比如在一个操作系统基础上,每个进程有自己的虚拟内存池,有自己的内核句柄集合,但是共享一个CPU,这里CPU是全局单例的,而虚拟内存池,内核句柄集合是局部单例的。
需要说明的是,单例有一个特性,是延迟创建,只在第一次使用时才创建单例。因此上面的例子还不算严格的单例。
局部单例模式有什么用呢?通过上面的例子,我们不难发现,局部单例模式最大的优点在于解耦合,对于某个类型的对象,每个子系统有自己的一个独立实例,这些子系统就不会相互影响。
从操作系统的讨论回到我们自己写的程序上,你也许会说:我们的进程中的全局单例在整个系统中就是一个局部单例啊。不错,进程其实已经很好的隔离了对象,我们这里要讨论的是在一个进程内的多个子模块中实现局部单例。
这有什么意义呢?
我们现在的大型软件都依赖了很多第三方库,我们也会提供自己的库给别人使用,如果库的提供者滥用全局单例(C++中应该是函数静态变量实现),作为库的使用方你不觉得很难受吗。这些全局单例会一直生存到进程退出的时候,占用内存不说,在进程退出时要销毁这些全局单例,还指不定会出什么问题,因为进程退出时的状态比较特殊。我们有些程序正常运行中没有问题,但是一旦退出的时候就crash,很大比例的原因就在于没有处理好全局单例的销毁。
还有,如果有两个模块(你负责其中一个)都使用了第三个模块,而第三个模块里面有一个全局单例,你不觉得心惊胆战吗,你是否要与另一个模块小心处理访问同步。
另一方面,作为库的提供者,如果不使用全局单例,你的工作会轻松很多,你不需要担心使用者的调用方式是否满足要求,不需要小心处理线程间同步,也不需要关心程序退出时的特殊环境问题。
可以了解一下Java,Java中是没有全局对象的,但是可以定义属于类型的属性,可是这不是局部单例。
boost.asio库是局部单例的一个很好应用,也是c++语言实现局部单例模式的经典方案。
相关文章推荐
- 通过例子学设计模式之--组合模式以及使用场景说明(C++实现)
- 三种工厂模式的分析以及C++实现
- 通过例子学设计模式之--原型模式以及使用场景说明(C++实现)
- 三种工厂模式的分析以及C++实现
- 通过例子学设计模式之--单例模式以及多线程下说明(C++实现)
- 通过例子学设计模式之--外观模式以及使用场景说明(C++实现)
- 三种工厂模式的分析以及C++实现
- C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式
- 通过例子学设计模式之--简单工厂模式以及使用场景说明(C++实现)
- 设计模式之单例模式 c++实现以及详解
- 三种工厂模式的分析以及C++实现
- 三种工厂模式的分析以及C++实现
- 通过例子学设计模式之--适配器模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--建造者模式以及使用场景说明(C++实现)
- 设计模式之代理模式 c++实现以及详解
- 类成员C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式
- C++无法被继承的类实现以及单例模式的类的实现
- 单例模式简介以及C++版本的实现
- 通过例子学设计模式之--抽象工厂模式以及使用场景说明(C++实现)
- 通过例子学设计模式之--桥接模式以及使用场景说明(C++实现)