单例模式 (Singleton Pattern)

单例模式 (Singleton Pattern)

意图:确保一个类只有一个实例,并提供一个全局访问点。

基础组件
  • Singleton:单例类,包含一个静态实例指针,私有构造函数,以及一个获取实例的静态方法。
继承/实现关系

单例模式通常不涉及继承关系(除非是子类单例,但一般情况是独立类)。

应用场景
  • 需要全局唯一实例,如配置管理器、日志管理器、线程池等
  • 控制资源访问,如数据库连接池
C++ 实现(线程安全的现代C++实现)
#include <iostream>

/*
* 单例模式
* 意图:确保一个类只有一个实例,并提供一个全局访问点。
* 基础组件:
* - Singleton(单例类):包含一个静态实例指针,私有构造函数,以及一个获取实例的静态方法。
* 继承/实现关系
* 单例模式通常不涉及继承关系(除非是子类单例,但一般情况是独立类)。
*/

/*
* 以下提供一个线程安全的现代C++实现
*/
class Singleton
{
public:
	Singleton(const Singleton&) = delete; // 禁止拷贝构造
	Singleton& operator=(const Singleton&) = delete; // 禁止拷贝赋值

	static Singleton& getInstance()
	{
		// C++11 保证静态局部变量初始化是线程安全的
		static Singleton instance; 
		return instance;
	}

	static void setName(const std::string& newName)
	{
		getInstance().name = newName;
	}

	void doSomething()
	{
		std::cout << "Singleton Name: " << name << std::endl;
	}

private:
	Singleton() = default;
	std::string name{"A Singleton Class"};
};

void SingletonPattern()
{
	std::cout << std::string(13, '-') << " Singleton Pattern " << std::string(13, '-') << std::endl;

	Singleton& singleton = Singleton::getInstance();
	singleton.doSomething();
	singleton.setName("A Updated Singleton");

	Singleton& anotherSingleton = Singleton::getInstance();
	anotherSingleton.doSomething();
}

C++模板实现

#include <memory>
#include <mutex>

// 继承自该模板的类即默认实现了单例模式,但是要注意在实际类中将Singleton<YourClass>设置为友元类。
template <typename T>
class Singleton {
protected:
	Singleton() = default;
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	~Singleton() {
		//std::cout << "Singleton destructor called." << std::endl;
	}

private:
	static std::shared_ptr<T> m_instance;

public:
	static std::shared_ptr<T> GetInstance() {
		static std::once_flag initFlag;
		std::call_once(initFlag, [&]() {
			/*
			* 这里不能写成:
			* m_instance = std::make_shared<T>();
			* 因为 std::make_shared<T>() 会调用 T 的构造函数,而在它调用时处于std命名空间中,而T的构造函数是私有的,无法被访问。
			* 而m_instance = std::shared_ptr<T>(new T()) 则直接调用了 T 的构造函数。
			* 这种写法仅需在T的类中声明Singleton<T>为友元类即可。
			*/
			m_instance = std::shared_ptr<T>(new T());
		});
		return m_instance;
	}
};

template <typename T>
std::shared_ptr<T> Singleton<T>::m_instance = nullptr;
组件对应关系
  • Singleton 类本身包含了所有单例模式所需的组件:私有构造函数、静态实例获取方法、以及内部静态实例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值