单件模式(Singleton)C++实现

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实用性:1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它。

    2.当这个唯一的实例应该是通过子类可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

效果:   1.只有一个实例,可以严格的控制客户怎样以及何时访问。

    2.缩小名空间,避免了唯一实例的全局变量污染名空间。

    3.可以控制对象的实例个数。

    

 代码示例:这里类是一个人Micla,世界上仅有一个Mical,只能产生一个实例。

#ifndef _SINGLETON_
#define _SINGLETON_

class Mical{
public:
    ~Mical(){}

    static Mical* GetMical()
    {
        if(NULL == _mpMical)
        {
            _mpMical = new Mical;
            static Delete Del;
        }
        return _mpMical;
    }

private:
    static Mical* _mpMical;

    ////避免了不同情况实例化类对象
    Mical(const Mical& another){}
    Mical& operator = (const Mical& another){} 
    Mical(){}

};

#endif

 实现部分:

#include <iostream>
#include "Singleton.h"

using namespace std;
Mical* Mical::_mpMical = NULL;

int main()
{
    Mical* pMical = Mical::GetMical();
    delete Mical::GetMical();
    return 0;
}

用Mical* pMical = Mical::GetMical();   实现了访问Micla  然后我们可以通过pMical访问Mical的各种属性(假设为:身高,性别等)

之后通过delete Mical::GetMical();  删除对象。  但这样的删除容易被遗忘,因为new的过程是被封装起来的。

于是通过内嵌类实现自动delete:

#ifndef _SINGLETON_
#define _SINGLETON_

class Mical{
public:
    ~Mical(){}

    static Mical* GetMical()
    {
        if(NULL == _mpMical)
        {
            _mpMical = new Mical;
            static Delete Del;
        }
        return _mpMical;
    }
    

private:
    static Mical* _mpMical;

    ////避免了不同情况实例化类对象
    Mical(const Mical& another){}
    Mical& operator = (const Mical& another){} 
    Mical(){}

    class Delete{
    public:
        Delete(){}
        ~Delete(){delete _mpMical;}
    };
};

#endif

这就实现了Singleton;

要注意的是  1.封死其他的实例化接口      2.对象删除问题处理

原文地址:https://www.cnblogs.com/wrbxdj/p/4172929.html