动机
- 在软件系统中 , 经常有这样一些特殊的类 , 必须保证它们在系统中只存在一个实例 , 才能确保它们的逻辑正确性、 以及良好的效率。
- 如何绕过常规的构造器 , 提供一种机制来保证一个类只有一个实例?
- 这应该是类设计者的责任 , 而不是使用者的责任。
模式定义
- 保证一个类仅有一个实例 , 并提供一个该实例的全局访问点。
结构
要点
- Singleton模式中的实例构造器可以设置为protected以允许子类派生
- Singleton模式一般不要支持拷贝构造函数和clone接口,因为这有可能导致多个对象实例,与Singleton模式的初衷违背
- 如何实现多线程环境下安全的Singleton? 注意对双检查锁的正确实现。
代码
#include <iostream>
#include <mutex>
using namespace std;
class Singleton {
private:
static Singleton* m_instance;
static mutex m_mutex;
Singleton()
{
cout << "new Singleton" << endl;
}
Singleton(const Singleton&);
Singleton&
operator=(const Singleton&);
public:
static Singleton* GetInstance()
{
if (NULL == m_instance)
{
lock_guard<mutex> lock(m_mutex);
if (NULL == m_instance)
{
m_instance = new Singleton();
}
}
return m_instance;
}
void Tell()
{
cout << "This is Singleton." << endl;
}
~Singleton();
};
Singleton* Singleton::m_instance = nullptr;
mutex Singleton::m_mutex;
void TestSingleton()
{
Singleton::GetInstance()->Tell();
}