C++之单例模式~~

本文介绍了设计模式和单例模式。设计模式是解决特定场合问题的经验总结。单例模式指一个类只能实例化一个对象,可简化配置管理。文中还阐述了单例模式的饿汉和懒汉两种实现方式,分析了各自优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式

什么是设计模式
设计模式就是一套反复被使用,多数人知晓,经过分类的,对于一些特定的场合总结的经验。比如在古代,经常会发生战争,打仗也要有技巧,于是就出现了像孙子兵法,武穆遗书这种东西。。人们凭借这着这些经验,去解决相关的问题。在早期,一共有23种设计模式,例如简单工厂模式,适配器模式,观察者模式,单例模式等,而今天我与大家分享的就是单例模式。

单例模式

概念:单例模式指的就是一个类只能实例化一个对象。该模式保证了在系统中该类只有一个实例。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。下面我们看一下单例模式是如何实现的。

饿汉模式实现:就是不管你将来用不用,程序启动时就创建一个唯一的对象。

class Singleton{
	public:
		static Singleton* getInstance(){
			return &_instance;	
		} 
	private:
		Singleton(){};  //构造私有
		Singleton(Singleton const&); //拷贝构造私有
		Singleton& operator=(Singleton const&);  //赋值私有
		static Singleton _instance;
};
Singleton Singleton::_instance;  //程序入口前对单例对象初始化。
  1. 优点:实现比较简单
  2. 缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。

懒汉模式实现:如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好。

//单例模式实现

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


//懒汉模式实现

class Singleton {
public:
	static Singleton* GetInstance() {
		//外层判断是防止多次加锁导致CPU频繁切换
		if (_instance == nullptr) {
			_mutex.lock();
			//内层判断是保证只实例化一个对象
			if (_instance == nullptr) {
				_instance = new Singleton();
			}
			_mutex.unlock();
		}
		return _instance;
	}
	// 实现一个内嵌垃圾回收类
	class CGarbo {
	public:
		~CGarbo() {
			if (Singleton::_instance)
				delete Singleton::_instance;
		}
	};
	// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
	static CGarbo Garbo;
private:
	//构造 拷贝构造 赋值 私有化
	Singleton() {};
	Singleton(Singleton const&);
	Singleton& operator=(Singleton const&);
	static mutex _mutex;
	static Singleton* _instance;
};

Singleton* Singleton::_instance = nullptr;
mutex Singleton::_mutex;
Singleton::CGarbo Garbo;

void fun(int n) {
	cout << Singleton::GetInstance() << endl;
}

int main(void) {

	thread t1(fun, 10);
	thread t2(fun, 10);

	t1.join();
	t2.join();

	cout << Singleton::GetInstance() << endl;
	cout << Singleton::GetInstance() << endl;

	system("pause");
	return 0;
}
  1. 优点:初始化加载较快
  2. 缺点:程序运行的流畅度可能不够,存在线程安全问题。

以上就是我关于单例模式的介绍以及代码的实现,不足之处还望大家提醒我~~。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值