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

单例模式的学习笔记
单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性
参见链接1链接2

#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计模式是在软件开发中常用的一种编程思想,它提供了一种解决问题的方法论,可以帮助开发者更加灵活和高效地开发软件。基于qt4开源跨平台开发框架的PDF设计模式主要包括以下几个方面。 首先,观察者模式是一种常用的设计模式,它可以用于实现PDF文件的订阅和通知功能。通过该模式,用户可以选择关注自己感兴趣的PDF文件,并在文件更新时接收到通知。 其次,工厂模式是常用的创建型设计模式,它可以帮助开发者根据需要创建不同类型的PDF文件。例如,可以使用工厂模式创建基本的PDF文件、加密的PDF文件或者带有水印的PDF文件。 再次,装饰器模式是一种结构型设计模式,可以用于在不修改现有代码的情况下为PDF文件添加额外的功能。开发者可以通过装饰器模式为PDF文件添加页眉、页脚、书签等功能,同时保持原有的PDF文件结构和功能不受影响。 此外,策略模式也是常用的设计模式之一,在PDF开发中可以用于实现不同的压缩策略和加密策略。通过策略模式,开发者可以根据需求选择不同的策略来实现对PDF文件的处理和管理。 最后,单例模式是一种创建型设计模式,可以确保在整个应用程序中只有一个PDF文件实例。通过单例模式,可以在不同的模块中共享同一个PDF文件对象,避免资源浪费和数据冲突。 总而言之,设计模式在基于qt4开源跨平台开发框架的PDF开发中具有重要的作用。以上提到的几种设计模式可以帮助开发者更好地组织和管理PDF文件,提高开发效率和代码的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值