设计模式:单例模式 C++实现

文章目录

  • 前言
  • 1. 单例模式的理解
  • 2. 单例模式的C++实现
  • 总结
  • 参考


前言

今天复习最后一个设计模式:单例模式,这也是最常用的模式之一,这里给大家分享下!


1. 单例模式的理解

单例模式,就是只能创建一个类的对象,并且无法通过普通创建对象的方式来获取对象,即new一个对象,仅能通过特别的函数获得类的对象。

单例模式比较正规的定义与类图(引用《大话设计模式》)如下所示:
在这里插入图片描述
设计模式:单例模式 C++实现_第1张图片
注意,单例模式实现是将类的无参构造函数设置为私有访问权限,这样就不能在类外通过new的方式来创建对象。


2. 单例模式的C++实现

这里仅用C++实现单例模式,就不举例实现了,其实可以用单例模式来实现之前介绍过的简单工厂模式中工厂类,感兴趣大家可以自行实现!

这里的C++代码实现了线程安全的单例模式,所以用到了std::mutex和std::lock_guard类,如果大家不清楚这两个类的用法,可以在网上查找,有很多介绍,这里就不说了。

#include 
#include 
#include 

//****************Singleton Pattern****************
class Singleton
{
private:
	static Singleton* ptrInstance;
	static std::mutex m_mutex;

	Singleton() {}

public:
	static Singleton* GetInstance()
	{
		if (ptrInstance == NULL)
		{
			std::lock_guard<std::mutex> lock(m_mutex);
			if (ptrInstance == NULL)
			{
				ptrInstance = new Singleton();
			}
		}

		return ptrInstance;
	}

	~Singleton()
	{
		if (ptrInstance != NULL)
		{
			std::lock_guard<std::mutex> lock(m_mutex);
			if (ptrInstance != NULL)
			{
				delete ptrInstance;
			}
		}
	}
};

std::mutex Singleton::m_mutex;
Singleton* Singleton::ptrInstance = NULL;

//*********************Test***********************
int main()
{
	Singleton* obj1 = Singleton::GetInstance();
	Singleton* obj2 = Singleton::GetInstance();

	if (obj1 == NULL)
	{
		std::cout << "obj1 is null" << std::endl;
	}

	if (obj2 == NULL)
	{
		std::cout << "obj1 is null" << std::endl;
	}

	if (obj1 == obj2)
	{
		std::cout << "Single obj1 = obj2" << std::endl;
	}
	else
	{
		std::cout << "Single obj1 != obj2" << std::endl;
	}
	system("pause");
	return 0;
}

实现了上述代码,发现很罗嗦,在单例类中声明该单例类的静态对象属性,要在类外定义,还要使用std::mutex和std::lock_guard类实现线程安全,突然想到,如果用下面代码实现线程安全的单例类,不是很简单嘛!

class Singleton2
{
private:
	Singleton2() {}

public:
	static Singleton2* GetInstance()
	{
		static Singleton2 instance;
		return &instance;
	}
};

相比第一版Singleton类,Singleton2类的定义是不是简单很多,惊喜啊!


总结

单例模式的应用场景还是很多的,至少我接触的项目中基本都用过,用好这个模式还是很有好处的。

参考

《大话设计模式》

你可能感兴趣的:(C++设计模式,c++,设计模式)