C++单例模式使用

C++单例模式使用

简介

  一直以来都没有细细的看过设计模式,今天借助博客来记录一下学习过程。单例模式,是这些设计模式中最常用的一种模式,之前我们可能使用过全局或者静态变量的方式,现在可以考虑单例模式了。
单例模式主要是在一些工具类使用较多,因为工具类基本不用存储太多的跟自身有关的数据,这种情况下,如果每次都new一个对象,增加了开销,其实这就只需要实例一个对象。全局变量或者静态变量的方式,对封装性有影响。
将默认的构造函数声明为私有的,这样就不会被外部所new.
  此外在使用C++单例模式中较重要的一个细节就是要注意单线程和多线
程和多线程的区别。

1、常见使用

class Singleton
{
protected:
    Singleton();
private:
    static Singleton* p;//内部保存一个private static的类指针保存唯一实例
public:
    static Singleton* getInstance();
};//类后面加的;

Singleton::Singleton()
{
    cout<<"This is construct of Singleton!"<<endl;
}
Singleton* Singleton::getInstance()
{
    Singleton* p=NULL;
    //判断是否对象为空
    if(p==NULL)
        p=new Singleton();
    return p;
}  
//类中的静态成员变量要在类体外进行定义
Singleton* Singleton::p=0;

int main()
{
    p=Singleton::getInstace();//获取对象
}  

  上面的代码是一个单线程下的例子,不过这个方法是线程不安全的,如果两个线程同时调用getInstance()方法时,同时检测到p是一个NULL值,则两个线程会同时实例,这就是有问题了。

2、其他模式(懒汉和饿汉模式)

  饿汉模式,饿汉模式的实现本来就是线程安全的(思考点,空间换时间)。

class Singleton
{
protected:
    Singleton(){}
private:
    static Singleton* p;
public:
    static Singleton* getInstance();
};
Singleton* Singleton::p=new Singleton;
Singleton* Singleton::getInstance()
{
    return p;
}
;