- 单例模式是为了保证单例类的实例只有一个:
- 一台计算机连接多台打印机的例子可以很好解释单例模式的用途;
- 对于有些工具性质的类,基本不用存储太多跟自身有关的数据,在这种情况下每次都去new一个对象会增加开销,造成代码臃肿。其实,只需要一个实例就可以。
- 定义一个单例类:
使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法1来获取该实例。
#include<iostream>
class CSingleton
{
private:
CSingleton() {}; //构造函数是私有的
static CSingleton *m_pInstance; //私有静态指针
public:
static CSingleton * GetInstance() //公有静态方法
{
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};
CSingleton * CSingleton::m_pInstance = NULL; //类外初始化静态数据成员
int main()
{
CSingleton *s1 = CSingleton::GetInstance();
CSingleton *s2 = CSingleton::GetInstance();
if(s1 == s2)
cout<<"s1=s2"<<endl;
return 0;
}
程序的执行结果是:s1=s2
上例中,用户访问实例的唯一方法只有GetInstance()成员函数,因为类的构造函数是私有的。GetInstace()的返回值是当这个函数首次被访问时创建的,所有GetInstace()之后的调用都返回相同实例的指针。
单例类CSingleton有以下特征:
- 有一个指向唯一实例的静态指针m_pInstance,并且是私有的;
- 有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例;
- 其构造函数是私有的,这样就不能从别处创建该类的实例。