单例模式---设计模式

1.定义: 其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
具体的例子:购物车;系统的日记输出;
2.实现:
(1)实现一:(只适应与单线程的环境)
class Singleton
{
public:
   static Singleton *GetInstance()
    {
        if(instance==NULL)
        {
            instance=new Singleton;
            return instance;
        }
        return instance;
    }
    static void DeleteInstance()
    {
        if(instance!=NULL)
        {
            delete instance;
            instance=NULL;
        }      
    }
private:
    Singleton()
    {
    }
    static Singleton *instance;
};
Singleton *Singleton::instance=NULL;

(2)实现二:在多线程的情况下,就可能创建多个Singleton实例
加上一个同步锁;
class Singleton
{
public:
    static Singleton *GetInstance()
    {
        Lock();
        if(instance==NULL)
        {
            instance=new Singleton;
            return instance;
        }
        UnLock();
        return instance;
    }  
    static void DeleteInstance()
    {
        if(instance!=NULL)
        {
            delete instance;
            instance=NULL;
        }        
    }
private:
    Singleton()
    {
    }
    static Singleton *instance;
};
Singleton *Singleton::instance=NULL;


缺点:每次通过属性Instance得到一个实例,都会试图加上一个同步锁,而加锁的过程又是一个耗时的操作。

(3)实现三:
要实现的操作只是在实例没有创建之前需要进行加锁操作,以保证只有一个线程能够创建实例。
class Singleton
{
public:
    static Singleton *GetInstance()
    {
        if(instance==NULL)
        {
            Lock();
            if(instance==NULL)
            {                
                instance=new Singleton;
            }
            UnLock();
        }
        return instance;
    }
    static void DeleteInstance()
    {
        if(instance==NULL)
        {
           delete instance;
            instance=NULL;
        }
    }
private:
    static Singleton *instance;
    Singleton()
    {       
    }
};
Singleton Singleton::instance=NULL;
(4)实现四:
实现像智能指针的行为,自动释放内存空间。
class Singleton
{
private:
    Singleton()
    {
    }
    class Test
    {
    public:
        ~Test()
        {
           if(instance!=0)
            {
                cout<<"the descontructor is running"<<endl;
                delete instance;
                instance=0;
            }
        }
    };
    static Test te;
    static Singleton *instance;
public:
    static Singleton *GetInstance()
    {
        return instance;
    }
};
Singleton *Singleton::instance=new Singleton();
Singleton::Test Singleton::te;




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值