设计模式(单例模式)

设计模式( 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之前,多线程环境下有线程安全问题,要加锁保护。

相关推荐
微学AI8 小时前
一根针指向所有方向:挂谷猜想对 LLM Agent 技能-记忆架构的启示
开发语言·人工智能·架构·挂谷猜想
豆瓣鸡8 小时前
算法日记 - Day3
java·开发语言·算法
韭菜炒鸡肝天9 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
小王C语言9 小时前
【7. 实现登录注册模块】:实现会话管理、注册/登录/退出 API
网络·c++
Aaron - Wistron9 小时前
Web API C# (Furion版)带 单元测试
开发语言·后端·c#
Dxy123931021610 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
05664611 小时前
Python康复训练——常用标准库
开发语言·python·学习
骊城英雄11 小时前
基于C#+avalonia ui实现的跨平台点胶机灌胶监控控制上位机软件
开发语言·ui·c#
吾儿良辰11 小时前
一个被BCL遗忘的高性能集合:C# CircularBuffer<T>深度解析
开发语言·windows·c#
昆曲之源_娄江河畔11 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql