码迷,mamicode.com
首页 > 其他好文 > 详细

单件模式

时间:2014-12-19 00:31:28      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   使用   sp   on   div   

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

 

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

 

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

 

单件模式

标签:style   blog   io   color   os   使用   sp   on   div   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!