设计单例模式的意图是保证一个类仅有一个实例,并提供类的一个全局访问点,该实例被所有程序模块共享。

采用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的两个对象指针指向同一个实例,说明只能创建唯一的实例,并且该唯一实例是自动销毁的。