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;
}