设计模式(单例模式)

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

相关推荐
门前云梦5 小时前
《C语言·源初法典》---C语言基础(上)
c语言·开发语言·学习
achene_ql5 小时前
select、poll、epoll 与 Reactor 模式
linux·服务器·网络·c++
sjtu_cjs6 小时前
Tensorrt python api 10.11.0笔记
开发语言·笔记·python
哆啦A梦的口袋呀6 小时前
深入理解系统:UML类图
开发语言·python·uml
虎冯河6 小时前
怎么让Comfyui导出的图像不包含工作流信息,
开发语言·python
coding随想6 小时前
JavaScript中的原始值包装类型:让基本类型也能“变身”对象
开发语言·javascript·ecmascript
SY师弟6 小时前
51单片机——计分器
c语言·c++·单片机·嵌入式硬件·51单片机·嵌入式
2301_794333916 小时前
Maven 概述、安装、配置、仓库、私服详解
java·开发语言·jvm·开源·maven
葬爱家族小阿杰7 小时前
python执行测试用例,allure报乱码且未成功生成报告
开发语言·python·测试用例