单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)

Posted 别碰我的宏定义

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)相关的知识,希望对你有一定的参考价值。

文章目录


前言

提示:单例模式的出现。由于在某些场景中你最多而且必须有一个对象存在的情况,比如,监控摄像头对象,他在监控开启后只能有一个监控对象,单例模式就应运而生。


提示:以下是我对单例模式的理解

一、单例模式的概念

1.2单例模式的分类

单例模式:主要分为懒汉模式和饿汉模式。饿汉模式呢顾名思义比较饥渴,它会在程序加载过程中将对象进行初始化出来。懒汉模式会在程序运行阶段将对象初始化出来。两者的区别

1.2懒汉和饿汉的利弊

	懒汉模式的缺点:在加载时就会初始化对象,比较浪费内存,容易产生垃圾对象。
				由于其在加载时就会实例化对象,没有达到懒加载的效果。
	懒汉模式的优点:线程安全,不用加锁,效率较高。会在调用GetInstance前产生实例化对象,
				 对象	创建早。
	懒汉模式缺点:只有加锁才能保证多线程的安全性问题。而加锁会影响运行效率。
				实现难度相较于饿汉较大
	懒汉模式的优点:线程安全,懒加载,在第一次调用GetInstance的时候才会实例化对象。减少内存浪费。

二、代码实现

1.饿汉模式

饿汉模式

#include<iostream>
using namespace std;
//饿汉模式需要将构造函数,拷贝构造函数,赋值运算符的重载函数进行一个
//删除或者是私有化,定义一个静态成员变量,让他在程序加载时进行实例化对象
class Singleton 
public:
	static  Singleton& GetInstance() 
	//返回在程序加载时就实例化出的对象
		return sgl;
	
private:
	static Singleton sgl; //定义一个静态成员变量
private:
//将其构造,拷贝构造,赋值运算符重载私有化
	Singleton() 
	Singleton(Singleton&) = delete; //C++11新特性
	Singleton& operator=(Singleton&) = delete; //C++11新特性
;
//在类里面进行定义的静态成员变量需要在类外面进行实例化
Singleton Singleton::sgl;

2.懒汉模式

#include<iosteam>
#include<mutex>
using namespace std;
class Singleton 
public:
	static Singleton* GetInstance() 
		if (sgl == nullptr) //lock外的判空,
			//是因为获取锁,是很浪费时间的,
			//获取锁之外还有一层判断,
			//那么在第二次获取单例对象的时候,
			//lock外的if判断发现指针已经非空,就不会再获取锁了,
			//直接返回了对应的对象
			mutex_t.lock();
			if (sgl == nullptr) //lock里面判断一次,
			//因为可能有多个线程在lock处等待,
			//一个成功之后,会将m_psl设置为非空,
			//这样下个线程就算拿到lock资源,
			//再进去发现指针非空就离开了
				sgl = new Singleton();
			
			//这样双层检测,即保证了对象创建的唯一性,又减少了获取锁浪费的时间和资源
			mutex_t.unlock();
		
		return sgl;
	
	//创建内部类让其在程序结束后将创建的单例销毁
	class CGarbo 
		~CGarbo() 
			delete Singleton::sgl;
		
	;
private:
	static Singleton* sgl; //定义单例对象指针
	static mutex mutex_t; //定义锁
	static CGarbo gc; //定义内部类对象
private:
//将其构造拷贝构造和赋值运算符重载全部私有化
	Singleton() 
	Singleton(Singleton&) = delete;
	Singleton& operator=(Singleton&) = delete;
;
//类外对其静态成员变量进行一个初始化
Singleton* Singleton::sgl = nullptr;
mutex Singleton::mutex_t;
Singleton::CGarbo Singleton::gc;

懒汉模式的双if判断有对https://blog.csdn.net/andrewgithub/article/details/108966947
的参考。


总结

我只是对我学到的东西进行了一个简单的总结。希望各位大佬多多指出错误和不足。

以上是关于单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)的主要内容,如果未能解决你的问题,请参考以下文章

手写单例模式(饿汉和饱汉模式)和工厂模式

单例模式中的懒汉模式和饿汉模式是什么?区别又是什么?

单例模式中的懒汉模式和饿汉模式是什么?区别又是什么?

单例模式下的懒汉和饿汉模式

单例设计模式中的懒汉式和饿汉式

单例设计模式中的懒汉式和饿汉式