C++单例模式

来源:互联网 发布:2015年老龄化数据 编辑:程序博客网 时间:2024/05/17 22:04

什么叫单例模式?

       单例模式也称为单件模式、单例模式约束了类的实例化,只允许类创建一个对象,也就是类的构造函数外界不可访问;并提供一个访问它的全局访问点,也就是提供了创建对象的接口。 

      

构造函数却是私有的(前面是“ - ”符号),

然后在里面还公开了一个 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的析构函数,该析构函数会删除单例的唯一实例。






0 0