利用c++实现单件模式
来源:互联网 发布:交换机 mac 编辑:程序博客网 时间:2024/06/14 13:27
1. 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2. 动机 对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机( printer spooler),只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A / D转换器。一个会计系统只能专用于一个公司。 我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式。
3. 适用性 在下面的情况下可以使用Singleton模式. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
4. 结构
5. 参与者 Singleton 定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个类操作(即Smalltalk中的一个类方法和C++中的一个静态成员函数)。可能负责创建它自己的唯一实例。
6. 协作 客户只能通过Singleton的GetInstance操作访问一个Singleton的实例。
7. 效果 Singleton模式有许多优点: 1) 对唯一实例的受控访问因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。 2) 缩小名空间Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。 3) 允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。 4) 允许可变数目的实例这个模式使得你易于改变你的想法,并允许Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。 5) 比类操作更灵活另一种封装单件功能的方式是使用类操作(即C++中的静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改变设计以允许一个类有多个实例。 此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。
8. 实现
class Singleton { static std::auto_ptr<Singleton> m_pInstance; protected: //prevent user making our any instance by manually //构造函数是保护类型的。 Singleton(){} public: ~Singleton(){} //Return this singleton class' instance pointer static Singleton* Instance() { if(!m_pInstance.get()) { m_pInstance = std::auto_ptr<Singleton>(new Singleton()); } return m_pInstance.get(); } };
怎样来使用它呢?不要试图从这个类派生你的单件子类,那样的结果是不妥当的,如果你需要多个单件子类,还是使用下面的宏定义更为妥当:
#define DEFINE_SINGLETON(cls)/ private:/ static std::auto_ptr<cls> m_pInstance;/ protected:/ cls(){}/ public:/ ~cls(){}/ static cls* Instance(){/ if(!m_pInstance.get()){/ m_pInstance = std::auto_ptr<cls>(new cls());/ }/ return m_pInstance.get();/ } #define IMPLEMENT_SINGLETON(cls) / std::auto_ptr<cls> cls::m_pInstance(NULL);
假定你需要实现一个单件类YY,这样书写:
class YY { DEFINE_SINGLETON(YY); public: //your interfaces here... };
在cpp文件中,书写:
IMPLEMENT_SINGLETON(YY);
如果需要定义其他的单件类,重复上面的定义,就可以了。
- 利用c++实现单件模式
- [C++] 单件模式的一般实现
- C语言之单件模式完全实现
- 单件模式(c++)
- 单件模式【C++】【转载】
- C语言单件模式
- 单件模式-C++实现
- C语言设计模式:单件模式
- Objective-C利用GCD技术实现单例模式
- 简单的单件模式类(C#)
- [iOS] Objective-C的单件模式
- ISingletonDisplayer 单件模式显示器C#实现
- 单件模式之PHP实现
- 单件模式的C++标准实现
- 单件模式的C++模板实现
- 游戏里的单件模式实现
- 单件模式的C++标准实现
- 单件模式之C++实现
- 堆排序
- 《COM 原理与应用》学习笔记 - 第一部分 COM原理收藏
- 利用堆之优先队列
- 策略模式(1)——基本思想
- 策略模式(2)——c++接口类的实现
- 利用c++实现单件模式
- 快速排序
- Junit 4
- 计数排序
- 基数排序
- 最大值-最小值
- 查找第i个元素
- MySQL的使用
- tomcat是什么