设计模式(单例模式)

设计模式( Design Pattern )是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的,目的是为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。

**单例模式:**一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个 访问它的全局访问点,该实例被所有程序模块共享

两种实现模式:

1. 饿汉模式:程序执行前就创建了,全局只有一个实例对象。
cpp 复制代码
class A
{
public:
	static A* create()
	{
		return &_a;
	}
private:
	int _port;
	// 静态资源全局只有一份
	// 属于整个类,受类域影响
	static A _a;

private:
	A() {}
	A(const A& copy) = delete;
	A& operator=(const A& copy) = delete;
};
A A::_a;

借助全局对象在程序运行之前创建初始化,每次访问都是同一个对象。

缺点:

如果程序里出现大量的懒汉模式的单例,程序运行起来要预先创建大量的资源,导致程序启动慢。

如果类与类之间有相互依赖关系,全局对象创建顺序可能是乱的,那么就会导致A需要用B类,A类先创建,而B类未创建。

2. 懒汉模式:和饿汉模式相反,是在程序运行时有且只有一个实例对象
cpp 复制代码
class A
{
public:
	static A* create()
	{
		// C++11之前存在线程安全问题
		// 可能多个线程同时调用 new 在调用,operator new
		// 会导致 new 了多个 A 给 a*,所以要加锁
		static A *a = new A;
		return a;
	}
private:
	int _port;

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

另一种方式:

cpp 复制代码
class A
{
public:
	static A* create()
	{
		// 如果有大量的获取单例对象
		// 就不用进行频繁的加锁解锁
		if (_a == nullptr)
		{
			// C++11之前 对多线程情况下的保护
			_mt.lock();
			if (_a == nullptr)
			{
				_a = new A;
			}
			_mt.unlock();
		}
		return _a;
	}

	// 析构静态资源,程序结束自动调用
	class Release
	{
	public:
		~Release() { if (A::_a != nullptr)delete A::_a; }
	};
	static Release _RL;

private:
	// 程序执行之前创建,大小忽略不计
	static A* _a;
	static mutex _mt;

private:
	A() {}
	A(const A& copy) = delete;
	A& operator=(const A& copy) = delete;
};
// 初始化静态成员
A* A::_a = nullptr;
mutex A::_mt;
A::Release A::_RL;

缺点:在C++11之前,多线程环境下有线程安全问题,要加锁保护。

相关推荐
黑客-雨3 分钟前
从零开始:如何用Python训练一个AI模型(超详细教程)非常详细收藏我这一篇就够了!
开发语言·人工智能·python·大模型·ai产品经理·大模型学习·大模型入门
Pandaconda8 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
半盏茶香9 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
加油,旭杏12 分钟前
【go语言】变量和常量
服务器·开发语言·golang
行路见知12 分钟前
3.3 Go 返回值详解
开发语言·golang
xcLeigh16 分钟前
WPF实战案例 | C# WPF实现大学选课系统
开发语言·c#·wpf
哎呦,帅小伙哦17 分钟前
Effective C++ 规则41:了解隐式接口和编译期多态
c++·effective c++
NoneCoder26 分钟前
JavaScript系列(38)-- WebRTC技术详解
开发语言·javascript·webrtc
关关钧37 分钟前
【R语言】数学运算
开发语言·r语言
十二同学啊39 分钟前
JSqlParser:Java SQL 解析利器
java·开发语言·sql