设计模式---单例模式

谈到单例模式,首先得了解一下什么是设计模式?

设计模式:
是一套被反复使用,为多数人知晓,经过分类的,代码设计经验的总结。就是前人采取的通用解决问题的方法,如同《孙子兵法》一样,是一种套路,做事模式。
使用设计模式的目的:
为了代码的可重用性,让代码更容易被他人理解,保证代码可靠性。设计模式使得代码编写工程化,更加规范化。

单例模式:

就是指一个类只能创建一个对象。单例模式可以保证系统中该类只有一个实例,并且提供一个访问实例的全局访问接口,该类被所有程序模块共享。就比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象同一读取,然后服务进程中的其他对象在通过这个单例对象获取这些配置信息。
单例模式的实现模式:懒汉模式 和 饿汉模式
饿汉模式:就是在程序一启动的时候就创建一个唯一的实例对象
饿汉模式的适用场景:如果这个单例对象在多线程,高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。
//饿汉模式,在程序一启动的时候就实例化对象
class Singleton
{
public:
	static Singleton* GetInstance()
	{
		return &instance;
	}

private:
	//构造函数私有
	Singleton() {};

	//拷贝构造 和 赋值运算符私有
	Singleton(Singleton const&);
	Singleton& operator=(const Singleton&);

	static Singleton instance;
};

Singleton Singleton::instance;  //在程序入口前就完成单例对象的初始化

懒汉模式:不在程序启动时加载,而是在用到的时候才实例化对象,是一种延迟加载模式。
懒汉模式的适用场景: 如果单例对象构造十分耗时或者占用很多资源,比如加载插件,初始化网络,读取文件等等,而且有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常缓慢,因此就使用延迟加载(懒汉模式)更好。
注意:由于懒汉模式是在用到是才会实例化对象,因此有可能导致线程不安全,因此需要使用互斥锁来保证线程的安全性。
#include <iostream>
#include <mutex>
using namespace std;

class Singleton
{
public:
	static Singleton* GetInstance()
	{
		//使用双重加锁的方式来保证线程安全
		if (nullptr == m_pInstance)
		{
			m_mtx.lock();
			if (nullptr == m_pInstance)
			{
				m_pInstance = new Singleton();
			}
			m_mtx.unlock();
		}
		return m_pInstance;
	}


	//实现一个内嵌垃圾回收类
	class CGarbo
	{
	public:
		~CGarbo()
		{
			if (Singleton::m_pInstance)
				delete Singleton::m_pInstance;
		}
	};

	//定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
	static CGarbo Garbo;


private:
	//构造函数私有
	Singleton() {};

	//拷贝函数私有
	Singleton(const Singleton&);

	//赋值运算符私有
	Singleton& operator=(const Singleton&);

	static Singleton* m_pInstance;  //单例对象指针
	static mutex m_mtx;  //互斥锁
};

Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值