首页 > 代码库 > 单件模式

单件模式

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

 

实用性: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.对象删除问题处理

 

-----新手初学,望大神指点-----

 

单件模式