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

2022年9月28日12:14:49

前言

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


1. 单例模式的理解

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

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


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

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

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

#include<iostream>#include<memory>#include<mutex>//****************Singleton Pattern****************classSingleton{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=newSingleton();}}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***********************intmain(){
	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");return0;}

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

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

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


总结

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

参考

《大话设计模式》

  • 作者:DU_YULIN
  • 原文链接:https://blog.csdn.net/DU_YULIN/article/details/120184590
    更新时间:2022年9月28日12:14:49 ,共 1633 字。