C++设计模式--单例模式

单例模式的学习笔记

单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性

参见链接1链接2

cpp 复制代码
#include <iostream>
#include <mutex>

using namespace std;


/*懒汉模式:只有在用到了才实例化对象并返回(调用了对外的接口才会实例对象)*/
/*构造函数私有化,只对外提供一个接口*/

/*线程不安全*/
class singleClass {
public:

	static singleClass* getInstance() // 对外接口,静态成员函数调用静态成员变量
	{
		if (m_instance == nullptr)  // 在多线程的环境下,在判空的时候可能存在多个线程同时进入if中,此时可能会实例化多个对象
		{
			m_instance = new singleClass();
		}
		return m_instance;
	}

private:
	static singleClass* m_instance;  // 静态成员变量,类内声明,类外初始化
	singleClass() {}    // 构造函数属性设置为私有

	singleClass (const singleClass & sc) {}  // 拷贝构造函数也设置为私有
};

singleClass* singleClass::m_instance = nullptr;   // 初始化静态变量

/*线程安全*/
class threadSingleClass
{
public:
	static threadSingleClass* getInstance()
	{
		if (m_instance == nullptr)   // 先判断是否为空,为空就进入;不为空,说明已经存在实例,返回
		{
			//m_mutex.lock();   // 这里如果使用unique_lock就不需要在下面解锁
			unique_lock<mutex> lock(m_mutex);
			if (m_instance == nullptr)   // 再次判断,确保不会因为加锁期间多个线程同时进入
			{
				m_instance = new threadSingleClass();

			}
			//m_mutex.unlock();
		}
		return m_instance;
	}

private:
	static threadSingleClass* m_instance;
	static mutex m_mutex;

	threadSingleClass() {};
	threadSingleClass(const threadSingleClass& sc) {}
};

threadSingleClass* threadSingleClass::m_instance = nullptr;
mutex threadSingleClass::m_mutex;


/*饿汉模式:不管调不调用对外接口,都已经实例化对象了。本身就是线程安全的*/
/*类在加载的时候就实力化对象,所以要提前占用系统资源*/
class hungrySingleClass
{
public:
	static hungrySingleClass* getInstance()
	{
		return m_instance;
	}

private:
	static hungrySingleClass* m_instance;
	hungrySingleClass() {}
	hungrySingleClass(const hungrySingleClass* sc) {}  // 拷贝构造私有
};

hungrySingleClass* hungrySingleClass::m_instance = new hungrySingleClass();
// 类外定义,main开始执行前,该对象就存在了


int main()
{
	singleClass* singlep1 = singleClass::getInstance();
	singleClass* singlep2 = singleClass::getInstance();

	cout << singlep1 << endl;
	cout << singlep2 << endl;

	threadSingleClass* thsinglep1 = threadSingleClass::getInstance();
	threadSingleClass* thsinglep2 = threadSingleClass::getInstance();

	cout << thsinglep1 << endl;
	cout << thsinglep2 << endl;

	hungrySingleClass* hgsinglep1 = hungrySingleClass::getInstance();
	hungrySingleClass* hgsinglep2 = hungrySingleClass::getInstance();

	cout << hgsinglep1 << endl;
	cout << hgsinglep2 << endl;


	system("pause");
	return 0;
}
相关推荐
码匠许师傅16 分钟前
【C++三方组件】开篇总论:为什么需要以及如何选型?
开发语言·c++
h_a_o777oah22 分钟前
【Games101】C++ 软光追:光线追踪的求交逻辑和 BVH 提效实现及代码实现细节
c++·计算机图形学·光线追踪·games101·bvh·求交算法·软件渲染
cvby30 分钟前
C++11--右值引用和移动语义
开发语言·c++
xiangyun611 小时前
【408数据结构 03】线性表与顺序表:C++手写SeqList
开发语言·数据结构·c++
xxxiugou1232 小时前
双指针解题秘籍:从入门到精通
c语言·数据结构·c++·算法
代码中介商2 小时前
C++ 预约系统实战(一):项目总览与 C/S 架构设计
c语言·开发语言·c++
云边有个稻草人3 小时前
Tera Term 鸿蒙 PC 适配全记录:用 ArkUI 与 Native C++ 重建多协议终端工作流
c++·stm32·harmonyos
牛油果子哥q3 小时前
多模态大模型工程入门:图文Embedding、图文RAG、图片解析、C++多模态接口封装实战
开发语言·c++·embedding
6Hzlia4 小时前
【Classic 150 刷题计划】 LeetCode 134. 加油站 | C++ 贪心算法与局部否决逻辑
c++·leetcode·贪心算法
夜不会漫长4 小时前
C++:类和对象(1)
java·开发语言·c++