C++设计模式:单例模式(懒汉模式,痴汉模式,双重锁机制模式)

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();

你可能感兴趣的:(设计模式)