单例模式

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。
单例模式的应用场景:有一些对象其实只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象。这些对象只能够拥有一个实例,如果创建出了多个实例,就会导致一些程序的问题。程序的行为异常,资源使用的过量,或者导致不一致的结果。常用来管理共享的资源,比如数据库的连接或者线程池。
“通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个最好的办法就是,让类自身负责保护它唯一的实例。这个类可以保证没有其他实例可以被创建,并且它可以提供提供一个访问该实例的方法。DP”
singleton类,定义一个Getintance操作,允许访问它的唯一实例。Getintance是一个静态方法,主要负责创建自己的实例。

经典单件模式C++代码实现:

#include <iostream>
using namespace std;
//经典单例模式实现
class singleton{

public:
static   singleton *GetInstance();

    ~singleton()
    {
      if(instance == NULL)
          delete instance;
    }

private:

    static singleton *instance;   //利用一个静态变量来记录Singleton的唯一实例  
    singleton();

};


singleton *singleton::instance = NULL;  //静态成员变量初始化
singleton *singleton::GetInstance()
{
    if(instance == NULL)
        instance = new singleton();
    return instance;
}
singleton::singleton()
{
}


int main()
{
    singleton *singleObj = singleton::GetInstance();
    delete singleObj;
    return  0;
}

多线程的程序中,同时访问singleton类,调用GetInstance()方法,会有可能造成创建多个实例的。

singleton *singleton::GetInstance()
{
    lock()
    if(instance == NULL)
        instance = new singleton();
    unlock()
    return instance;
}

互斥的同步会导致性能的降低,即使instance已经不为空了,每次还是需要加锁,这样操作花费就比较多,性能必定比较差。

通过“双重锁定”可以提升性能。方法如下:
在第一次创建的时候进行加锁,当instance不为空的时候就不需要进行加锁的操作

singleton *singleton::GetInstance()
{
if(instance == NULL){
    lock();
    if(instance == NULL)
        instance = new singleton();
    unlock();
    return instance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值