解释说明:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例

要点如下
有且仅有一个实例
必须自行创建自己的唯一实例
必须给所有其他对象提供这一实例
具体实现要点如下
提供一个 private 构造函数(防止外部调用而构造类的实例)
提供一个该类的 static private 对象
提供一个 static public 函数,用于创建或获取其本身的静态私有对象(例如:GetInstance())
除此之外,还有一些关键点(需要多家注意,很容易忽视):
线程安全(双检锁 - DCL,即:double-checked locking)
资源释放
// 单例 - 懒汉式/饿汉式公用
class Singleton
{
public:static Singleton* GetInstance();
private:Singleton() {} // 构造函数(被保护)
private:static Singleton* m_pSingleton; // 指向单例对象的指针// GC 机制class GC{public:~GC(){// 可以在这里销毁所有的资源,例如:db 连接、文件句柄等if (m_pSingleton != NULL) {cout << "Here destroy the m_pSingleton..." << endl;delete m_pSingleton;m_pSingleton = NULL;}}static GC gc; // 用于释放单例};
};// 单例 - 懒汉式(双检锁 DCL 机制)
Singleton* Singleton::m_pSingleton = NULL;
Singleton* Singleton::GetInstance()
{if (m_pSingleton == NULL)m_pSingleton = new Singleton();return m_pSingleton;
}#include "singleton.h"
#include <iostream>
using namespace std;
Singleton::GC Singleton::GC::gc; // 重要
int main()
{Singleton::GetInstance();return 0;
}