单例模式是设计模式中较为简单明了的一种模式,目的是一个类只能有一个实例产生。 如果不考虑线程安全的话,一个简单的单例模式实现代码如下:
#include <iostream> using namespace std; class Singleton { public: static Singleton* GetInstance (); // 获取实例的接口 void DoSth () { cout << "Singleton::DoSth()" << endl; } private: Singleton (const Singleton&) {} Singleton& operator= (const Singleton&) {} Singleton () {} // 构造函数private static Singleton *instance; // 唯一的静态实例 }; Singleton* Singleton::GetInstance () { if (NULL == instance) instance = new Singleton(); return instance; } Singleton* Singleton::instance = NULL; int main (void) { Singleton sit (*Singleton::GetInstance()); sit.DoSth(); Singleton::GetInstance()->DoSth(); return 0; }代码很简单,将类的构造函数私有化,外界则不能创建此类的对象,提供一个统一的静态成员接口GetInstance来获取唯一的静态实例instance,获取到之后就可以由此实例操作类中的方法。
需要注意的点: 1)在把构造函数私有化的同时,也需要把拷贝构造函数和赋值操作符私有化,如若不然: Singleton sit (*Singleton::GetInstance()); 此种应用会生成一个新的对象sit。 2)对于程序结束后instance指针的释放问题,有一种方法是在Singleton类中定义一个子类,然后子类的析构函数里去释放instance指针,具体实现如下:
class Singleton { public: //... class ReleaseSource { ~ReleaseSource () { delete instance; } }; static RealeaseSource res; // ... }; Singleton::ReleaseSource Singleton::res; // 必须在此处初始化res才能进入到ReleaseSource的析构函数。