博客园  :: 首页  :: 联系 :: 管理

C++实现单件

Posted on 2006-12-21 13:15  sunrack  阅读(1244)  评论(0编辑  收藏  举报
在《设计模式》中有一个叫做单件(sigleton)的模式,是用来控制创建唯一对象。书中只讲到了如何建立singleton对象
,对于如何来销毁此对象则只字不提。但是对象生命的管理对于c++程序员来说是多么的重要呀。或许singleton只
是属于创建模式的一种,大师们认为在这里不应涉及到“销毁模式”。

有人认为sinleton是应该在程序的退出的时候销毁的。但是退出应该是在什么时候呢。
请看如下代码:
假设是按设计模式里的方式来写一个对象singlton对象。



class singlton
{
private:
    static singlton * _insatnce;
    singlton()
    {
        cout<<"object is ["<<this<<"] do< construction"<<endl;
    }
public:
    ~singlton()
    {
        cout<<"object is ["<<this<<"] do destruction>"<<endl;
        _insatnce = 0;
    }


    static singlton * getsinglton()
    {
        if(_insatnce)
            return _insatnce;
    
        _insatnce = new singlton;
       
        return _insatnce;
    }
    void dosomething()
    {
        cout<<"object is ["<<this<<"] do something"<<endl;
    }
};


singlton * singlton::_insatnce = null;


void foo(int i)
{
    /*


        程序体
    */
    if(i)
        singlton::getsinglton()->dosomething();
    /*


        程序体
    */
}
int main()
{
    /*
        void ;
        程序体
    */
    foo(1)


//  if(singlton::_insatnce) 
//       singlton::getsinglton(); 不能编译
    delete singlton::getsinglton();
}


事实上如果在singlton某次运行根本就没有调用过foo(1)而只是调用了foo(0),但是还必
须得在最后程序退出时调用实际上这时候调用getsinglton()来建立对象马上就被删除了
。这是完全没有必要也是浪费的。想在程序执行时使用判断语句也是行不通的。这样的实
现还是可以改进的,使用在singlton中再增加一个静态的成员函数checkexistinstance来判
断对象是否存在,可以提高效率。但这样又给对象增加了接口,增加了代码维护的开销。


但是对象在程序结束时你并不清楚是不是真的不再需要此对象了。我们再修改代码如下。


class singlton
{
private:
    static singlton * _insatnce;
    singlton()
    {
        cout<<"object is ["<<this<<"] do< construction"<<endl;
    }
public:
    ~singlton()
    {
        cout<<"object is ["<<this<<"] do destruction>"<<endl;
        _insatnce = 0;
    }


    static singlton * getsinglton()
    {
        if(_insatnce)
            return _insatnce;
    
        _insatnce = new singlton;
       
        return _insatnce;
    }
    void dosomething()
    {
        cout<<"object is ["<<this<<"] do something"<<endl;
    }
};


singlton * singlton::_insatnce = null;


void foo(int i)
{
    /*


        程序体
    */
    if(i)
        singlton::getsinglton()->dosomething();
    /*


        程序体
    */
}


class testsingleton
{
public:
    testsingleton()
    {
        singlton::getsinglton()->dosomething();
    }
    ~testsingleton()
    {
        singlton::getsinglton()->dosomething();//此处出现内存泄露
    }
};
testsingleton _test;
int main()
{
    /*
        void ;
        程序体
    */
    foo(1);