//饿汉模式 在程序创建的时候(main函数之前)单例实例被初始化
class Singleton {
public:
static Singleton & GetInstance()
{
return m_instance;
}
private:
Singleton() {}
~Singleton() {}
static Singleton m_instance;
};
Singleton Singleton::m_instance;
//懒汉模式 第一次调用GetInstance时创建单例实例
//非线程安全,可以在main函数中统一调用GetInstance方法,这样可以保证线程安全
class Singleton {
public:
static Singleton* GetInstance()
{
if (nullptr == m_instance) {
m_instance = new Singleton();
}
return m_instance;
}
private:
Singleton() {}
~Singleton() {}
static Singleton* m_instance;
};
Singleton* Singleton::m_instance = nullptr; //main函数之前初始化为nullptr
//C++11线程安全版本,实例为静态局部变量
class Singleton {
public:
static Singleton& GetInstance()
{
static Singleton m_instance;
return m_instance;
}
private:
Singleton() {}
~Singleton() {}
};
template<typename DerivedClass>
struct Singleton
{
static DerivedClass& Instance() {
static DerivedClass m_instance;
return m_instance;
}
protected:
Singleton() = default;
~Singleton() = default;
private:
Singleton(const Singleton&) = delete;
Singleton& operator=(Singleton&) = delete;
};
class A : public Singleton<A> {
public:
void Show() { cout << "A" << endl; }
private:
friend Singleton<A>;
A() {}
~A() {}
};
class B {
public:
void Show() { cout << "B" << endl; }
private:
friend Singleton<B>;
B() {}
~B() {}
};
void TestSingleton()
{
//A a;
A::Instance().Show();
Singleton<B>::Instance().Show();
}