单例模式 (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类本身包含了所有单例模式所需的组件:私有构造函数、静态实例获取方法、以及内部静态实例。

被折叠的 条评论
为什么被折叠?



