首页 > 其他 > 详细

单例模式

时间:2016-08-26 06:43:55      阅读:311      评论:0      收藏:0      [点我收藏+]

 单例模式,是一种类的设计模式,采用单例模式设计的类,只允许有一个实例。


为什么要采用单例模式:

1、有些对象在程序的整个声明周期中,为了保证数据的正确性,只允许有一个实例。

2、节省资源

3、满足“低耦合”的设计



单例模式的实现:

单例模式有两种实现方式:懒汉模式、饿汉模式


懒汉模式:

//////////////////////////////////////////////////////////
//懒汉模式
class Signletom	
{
public:
	static Signletom* GetInstance()
	{
		static mutex _mtx; //锁子
		if (_sInstance == NULL)//优化:双重检查,避免过多的加锁解锁,提高效率
		{
			//_mtx. lock();
			lock_guard<mutex> lock(_mtx);	//加锁,保证线程安全
			if (_sInstance == NULL)
			{
				//_sInstance = new Signletom();		//new抛异常的化,可能会死锁   可以改用lock_guard, 它采用RAII,类似智能指针,也就是:构造加锁,析构解锁
				Signletom *tmp = new Signletom();
				MemoryBarrier();							   //内存栅栏:作用:防止编译器的指令优化 (分配空间、构造函数、赋值 这三部必须严格按顺序进行)
				_sInstance = tmp;
			}
		}//_mtx.unlock();
		return _sInstance;
	}

	void Print()
	{
		cout << _a << endl;
	}
	 
protected:
	Signletom()    //构造函数写在里面
		:_a(0)
	{}

	Signletom(const Signletom*); //拷贝构造也写在里面,防止被调用
	Signletom& operator=(const Signletom&); //赋值操作符重载同上
protected:
	int _a;
	static Signletom *_sInstance;
};

Signletom* Signletom::_sInstance = NULL;


饿汉模式:

//////////////////////////////////////////////////////////
//懒汉模式
class Signletom	
{
public:
	static Signletom* GetInstance()
	{
		static mutex _mtx; //锁子
		if (_sInstance == NULL)//优化:双重检查,避免过多的加锁解锁,提高效率
		{
			//_mtx. lock();
			lock_guard<mutex> lock(_mtx);	//加锁,保证线程安全
			if (_sInstance == NULL)
			{
				//_sInstance = new Signletom();		//new抛异常的化,可能会死锁   可以改用lock_guard, 它采用RAII,类似智能指针,也就是:构造加锁,析构解锁
				Signletom *tmp = new Signletom();
				MemoryBarrier();							   //内存栅栏:作用:防止编译器的指令优化 (分配空间、构造函数、赋值 这三部必须严格按顺序进行)
				_sInstance = tmp;
			}
		}//_mtx.unlock();
		return _sInstance;
	}

	void Print()
	{
		cout << _a << endl;
	}
	 
protected:
	Signletom()    //构造函数写在里面
		:_a(0)
	{}

	Signletom(const Signletom*); //拷贝构造也写在里面,防止被调用
	Signletom& operator=(const Signletom&); //赋值操作符重载同上
protected:
	int _a;
	static Signletom *_sInstance;
};

Signletom* Signletom::_sInstance = NULL;


单例模式

原文:http://zhweizhi.blog.51cto.com/10800691/1842655

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!