设计模式--单例模式(c++实现)

本文介绍了设计模式中的单例模式,确保一个类只有一个实例,并提供全局访问点。通过C++代码示例解释了如何使用Double Check解决线程安全问题,保证在多线程环境下也能正确实现单例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:顾名思义,确保一个类在任何情况下都只有一个实例。

#include<iostream>
using namespace std;

class SingletonDP
{
public:
	static SingletonDP* GetInstance();
private:
	SingletonDP() 
	{ 
		cout << "Constructor" << endl; 
	};//构造函数私有
	static SingletonDP* pSingleInst;
};

SingletonDP* SingletonDP::pSingleInst = nullptr;
SingletonDP* SingletonDP::GetInstance()
{
	cout << "Return Instance By GetInstance()" << endl;
	if (!pSingleInst)
		pSingleInst = new SingletonDP();
	return pSingleInst;
}

int main()
{
	cout << "SingletonDPTest" << endl;
	SingletonDP *pTemp1 = SingletonDP::GetInstance();
	SingletonDP *pTemp2 = nullptr;
	if (pTemp1) pTemp2 = pTemp1->GetInstance();
	cout << "pTemp1 Address: " << pTemp1 << endl;
	cout << "pTemp2 Address: " << pTemp2 << endl;
	system("pause");
	return 0;
}

从上述例子输出结果可以看出:1.在获取该类实例对象时才会走构造函数;2.两者地址相同满足单例模式。

但是,这种方式是线程不安全的,如果多个线程都第一次访问该类实例的时候,可能会创建多个实例。

 

#include<iostream>
#include<mutex>
using namespace std;

class SingletonDP
{
public:
	static SingletonDP* GetInstance();
private:
	SingletonDP() 
	{ 
		cout << "Constructor" << endl; 
	};//构造函数私有
	static SingletonDP* pSingleInst;
	static mutex sMutex;
};

SingletonDP* SingletonDP::pSingleInst = nullptr;
mutex SingletonDP::sMutex;
SingletonDP* SingletonDP::GetInstance()
{
	cout << "Return Instance By GetInstance()" << endl;
	if (!pSingleInst)
	{
		sMutex.lock();
		if(!pSingleInst)
			pSingleInst = new SingletonDP();
		sMutex.unlock();
	}
	return pSingleInst;
}

int main()
{
	cout << "SingletonDPTest" << endl;
	SingletonDP *pTemp1 = SingletonDP::GetInstance();
	SingletonDP *pTemp2 = nullptr;
	if (pTemp1) pTemp2 = pTemp1->GetInstance();
	cout << "pTemp1 Address: " << pTemp1 << endl;
	cout << "pTemp2 Address: " << pTemp2 << endl;
	system("pause");
	return 0;
}

如上述代码所示:在GetInstance()方法中通过Double Check解决线程不安全问题。(也可以通过在创建线程之前先实例化一个实例对象来解决该问题)

#include<iostream>
using namespace std;

class SingletonDP
{
public:
	static SingletonDP* GetInstance()
	{
		static SingletonDP OnlyInstance;
		return &OnlyInstance;
	}
private:
	SingletonDP()
	{
		cout << "Constructor" << endl;
	};//构造函数私有
};


int main()
{
	cout << "SingletonDPTest" << endl;
	SingletonDP *pTemp1 = SingletonDP::GetInstance();
	SingletonDP *pTemp2 = nullptr;
	if (pTemp1) pTemp2 = pTemp1->GetInstance();
	cout << "pTemp1 Address: " << pTemp1 << endl;
	cout << "pTemp2 Address: " << pTemp2 << endl;
	system("pause");
	return 0;
}

 上述模式在类创建的同时就已经创建好一个静态对象,以后不会改变,是线程安全的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值