200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 单例模式的C++实现(懒汉模式和饿汉模式的详细讲解和实现)

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

时间:2024-06-14 06:11:15

相关推荐

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

文章目录

前言一、单例模式的概念1.2单例模式的分类1.2懒汉和饿汉的利弊二、代码实现1.饿汉模式2.懒汉模式总结

前言

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


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

一、单例模式的概念

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判断有对/andrewgithub/article/details/108966947

的参考。


总结

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。