单例模式概念
- 三个要点
(1) 某个类只有一个实例对象
(2)它必须自行创建实例
(3)它必须自行向整个系统提供实例
- 实现步骤
(1) 构造函数私有化(保证外部不能进行实例化)
(2)提供一个全局的静态方法,来获取单例对象
(3)类中定义一个静态指针,指向本类
class SingleObject
{
private:
SingleObject()
{
cout << "我是懒汉式单例" << endl;
}
public:
static SingleObject* GetInstance()
{
if (instance == NULL)
{
instance = new SingleObject;
}
return instance;
}
private:
static SingleObject* instance;
};
SingleObject* SingleObject::instance = NULL;
class SingleObject
{
private:
SingleObject()
{
cout << "我是饿汉式单例" << endl;
}
public:
static SingleObject* GetInstance()
{
return instance;
}
private:
static SingleObject* instance;
};
SingleObject* SingleObject::instance = new SingleObject;
int main(void)
{
SingleObject* a = SingleObject::GetInstance();
SingleObject* b = SingleObject::GetInstance();
if (a == b)
{
cout << "懒汉式实例只有一个" << endl;
}
SingleObject1* a1 = SingleObject1::GetInstance();
SingleObject1* b1 = SingleObject1::GetInstance();
if (a1 == b1)
{
cout << "饿汉式实例只有一个" << endl;
}
return 0;
}

单例碰到多线程
- 懒汉式碰到多线程是不安全的(需加锁):如果两个线程同时GetInstance,则new出两个实例
- 饿汉式在多线程的情况下是安全的:实例创建在线程启动之前