设计单例模式的意图是保证一个类仅有一个实例,并提供类的一个全局访问点,该实例被所有程序模块共享。
采用C++实现单例模式有多种方式,这里采用嵌套类实现。
其中类A实现单例模式。
- 它的构造函数的私有的,这样就不能从别处创建该类的实例。
- 它有一个唯一实例的静态对象指针pinstance,且是私有的。
- 它有一个共有函数GetInstance(),可以获取这个唯一的实例,并在需要的时候创建该实例。
- 设计嵌套类的目的是为了定义它的静态子对象,在程序结束时会调用该子对象的析构函数以释放唯一的实例。
- 如果采用在类A中设计析构函数来释放实例,则该析构函数必须是公用的,这在单例模式中是不恰当的。
源代码如下:
#include<iostream> using namespace std; class A{ //其他数据成员 public: static A *GetInstance(){ if(pinstance ==NULL){ pinstance = new A(); } return pinstance; } private: static A *pinstance;//返回唯一实例的指针 class B //嵌套类,它的唯一工作就是在析构函数中释放实例 { public: ~B(){ if(A::pinstance!=NULL){ delete A::pinstance; cout<<"delete"; } } }; static B b;//定义一个子对象,在程序结束时会调用它的析构函数 }; A *A::pinstance=NULL;//静态子对象指针初始化 A::B A::b;//静态子对象初始化 int main(){ A *p= A::GetInstance(); A *q = A::GetInstance(); if(p == q) cout<<"Same"<<endl; return 0; }
输出结果为:
Same delete
从结果可以看出类A的两个对象指针指向同一个实例,说明只能创建唯一的实例,并且该唯一实例是自动销毁的。