设计模式 C++单例模式

单例模式

单例模式作用:主要解决一个全局使用的类频繁的创建和销毁的问题。单例模式下可以确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式的三要素:1、某个类只能有一个实例 2、它必须自行创建这个实例 3、必须自行向整个系统提供这个实例

单例模式使用场景:如果系统有类似的实体(有且只有一个,且需要全局访问),那么就可以将其实现为一个单例。实际工作中常见的应用举例:

  1. 日志类,一个应用往往只对应一个日志实例。
  2. 配置类,应用的配置集中管理,并提供全局访问。
  3. 管理器,比如windows系统的任务管理器就是一个例子,总是只有一个管理器的实例。
  4. 共享资源类,加载资源需要较长时间,使用单例可以避免重复加载资源,并被多个地方共享访问。

C++中实现单例模式有两种,分别是 饿汉式懒汉式

饿汉式

饿汉式:不管你将来用不用,程序启动时就创建一个唯一的实例对象
优点:后续使用时无需加载,使用流畅,不存在多线程安全问题
缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定

代码实现流程:将该类的构造方法定义为私有方法,这样子其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例

#include <iostream>
using namespace std;

//饿汉式
class Singleton
{
public:
	//获取唯一实例的静态方法
	static Singleton* getSingleton()
	{
		return &_singleton;
	}

private:
	//私有构造
	Singleton() {};
	Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&) = delete;
	
	static Singleton _singleton;
};
Singleton Singleton::_instance;

懒汉式

懒汉式:当你使用的时候才会去创建唯一实例
优点:第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制
缺点:使用不比饿汉式流畅,实现复杂,需要自己实现线程安全

代码实现流程:构造函数私有化,将拷贝构造和赋值运算符重载设置为删除函数,成员属性有两个,分别是静态的互斥锁和一个静态的该类指针,这个指针初始化为空。然后再类中定义静态的一个获取对象的函数。在该函数中需要双重检测,第一个检测是优化代码性能,让线程不要每次都需要加锁判断,第二个检测是用于保证对象只被创建一次,该操作需要被加锁保护。

代码

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

//懒汉式
class Singleton
{
public:
	static Singleton* getSingleton()
	{
		if (_singleton == nullptr)
		{
			_mutex.lock();
			if (_singleton == nullptr)
			{
				_singleton = new Singleton();
			}
			_mutex.unlock();
		}
		return _singleton;
	}

private:
	Singleton() {};
	Singleton(Singleton const&) = delete;
	Singleton& operator=(Singleton const&)delete;

	static mutex _mutex;//互斥锁
	static Singleton* _singleton;
};
Singleton* Singleton::_singleton = nullptr;
mutex Singleton::_mutex;

懒汉式和饿汉式的区别

  1. 懒汉式存在线程安全问题,创建对象时需要加锁处理,实现相对麻烦;而饿汉式不存在线程安全问题,实现相对简单
  2. 懒汉式是需要的时候才创建,不会影响程序的启动;而饿汉式是程序启动时就创建对象,导致启动速度慢,影响用户体验
  3. 当存在多个单例,要求必须先创建A才能创建B。此时的饿汉式就无法保证谁先创建;而使用懒汉式就可以手动控制创建顺序
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WhiteShirtI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值