什么叫单例模式?
单例模式也称为单件模式、单例模式约束了类的实例化,只允许类创建一个对象,也就是类的构造函数外界不可访问;并提供一个访问它的全局访问点,也就是提供了创建对象的接口。
构造函数却是私有的(前面是“ - ”符号),
然后在里面还公开了一个 GetInstance()方法,
单例模式的C++实现:
方法一:
class Singleton
{
private:
Singleton(){}
static Singleton* instance;
public:
~Singleton(){} // 因为外界负责delete,所以须注意析构函数访问权限
static Singleton* Instance() {
if(!instance) // 线程不安全,这里需要同步
instance_ = new Singleton;
return instance_;
}
};
该方法实现简单,缺点是在多线程的时候可能出现问题,而且该实例的析构函数会在什么时候执行?需要程序员负责在合适的时机销毁。
一个妥善的方法是让这个类自己知道在合适的时候把自己删除,或者说把删除自己的操作挂在操作系统中的某个合适的点上,使其在恰当的时候被自动执行。
我们知道,程序在结束的时候,系统会自动析构所有的全局变量。事实上,系统也会析构所有的类的静态成员变量。利用这个特征,我们可以在单例类中定义一个这样的静态成员变量,而它的唯一工作就是在析构函数中删除单例类的实例,如下面的代码中的cleaner类。
class CSingleton
{
private:
CSingleton()
{
}
static CSingleton *m_pInstance;
class cleaner //它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~cleaner()
{
if(CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static cleaner clr; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数
public:
static CSingleton * GetInstance()
{
if(m_pInstance == NULL) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
};<span style="font-size: 16px;">
</span>
类cleaner被定义为CSingleton的
私有内嵌类
,以防该类被在其他地方滥用。
程序运行结束时,系统会调用CSingleton的静态成员clr的析构函数,该析构函数会删除单例的唯一实例。