C++设计模式:单例模式(懒汉模式,痴汉模式,双重锁机制模式)
所谓单例模式就是这个类只生成一个对象,那么如何做到让他只生成一个对象呢?
- 将构造放在private访问限定符下;
- 在public访问限定符下提供一个结构调用构造;
- 通过访问标记是否为空而判断是创建对象还是返回对象
懒汉模式: 延时加载,需要的时候再加载(下面的普通单例模式和双重锁机制都是懒汉模式)
痴汉模式: 贪婪加载,对象提前加载
话不多说,上才艺!!!
- 普通单例模式
class SingleTon
{
public:
static SingleTon* GetInstance()
{
if (pm == NULL)
{
pm = new SingleTon();
}
return pm;
}
private:
SingleTon(){}
SingleTon(const SingleTon&);
static SingleTon*pm;
};
static SingleTon::SingleTon*pm = NULL;
1> 这里将GetInstance函数设定为static的原因是:不依赖对象调用,如果依赖对象调用的话,无法生成第一个对象。
2>这里将GetInstance函数的返回值设定为SingleTon*(也可以设为SingleTon&)而不是SingleTon的原因是:类类型作为返回值会生成临时对象,就违背了单例模式的要求。
3>这里将pm指针设置为static的原因:static修饰成员变量,该成员变量就相当于该类作用域下全局变量,并在类外初始化。
4> 这里将拷贝构造函数的声明也放在pravite关键字下的原因:防止通过对象再去生成对象,违背单例模式的要求。
- 双重锁机制的单例模式
引入该单例模式的原因是:上述的单例模式在多线程的情况下不安全,可能会造成内存泄漏,生成多个对象等问题。
class SingleTon
{
public:
static SingleTon* GetInstance()
{
if (pm == NULL)
{
pthread_mutex_lock(&mutex);
if (pm == NULL)
{
pm = new SingleTon();
}
pthread_mutex_unlock(&mutex);
}
return pm;
}
private:
SingleTon(){}
SingleTon(const SingleTon&);
static SingleTon*pm;
};
static SingleTon::SingleTon*pm = NULL;
1>这里引入的是互斥锁,代码不完善
- 痴汉模式的单例模式
在分线程之前生成生成唯一对象
优点:static初始化在主函数之前,所以在分线程之前生成生成唯一对象,不用担心线程安全问题。
缺点:如果后序操作不需要创建对象,就浪费内存了。
class SingleTon
{
public:
static SingleTon* GetInstance()
{
return pm;
}
private:
SingleTon(){}
SingleTon(const SingleTon&);
static SingleTon*pm;
};
static SingleTon::SingleTon*pm = new SingleTon();