单件模式

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

 

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

 

你可能感兴趣的:(模式)