简介
单例模式:
保证一个类有且只有一个实例,并提供一个访问它的全局访问点。
常用的场景
单例模式常常与工厂模式结合使用,因为工厂只需要创建产品实例就可以了,在多线程的环境下也不会造成任何的冲突,因此只需要一个工厂实例就可以了。
优点:
1.减少了时间和空间的开销(new实例的开销)。
2.提高了封装性,使得外部不易改动实例。
缺点:
1.懒汉式是以时间换空间的方式。
2.饿汉式是以空间换时间的方式。
注意点:
单例模式根据是否是线程安全分为两种:
懒汉式:在类中定义static对象,在instance时判断是否new,多线程时无法保证(pData == NULL)只生成一个对象,线程不安全。
饿汉式:在全局初始化类对象。
测试代码
#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;
#include <string>
#include <list>
//线程锁
class Lock
{
};
//懒汉线程不安全
class FLHanSinglen
{
private:
FLHanSinglen(){m_pInstance = NULL;};
~FLHanSinglen(){};
static FLHanSinglen* m_pInstance ;
public:
FLHanSinglen* getInstance()
{
if( m_pInstance == NULL )
{
m_pInstance = new FLHanSinglen();
}
return m_pInstance;
}
};
//懒汉线程安全
class FLAHanSinglen
{
private:
FLAHanSinglen(){m_pInstance = NULL;};
~FLAHanSinglen(){};
static FLAHanSinglen* m_pInstance ;
public:
static FLAHanSinglen* getInstance()
{
if(m_pInstance == NULL)
{
Lock lock;
if( m_pInstance == NULL )
{
m_pInstance = new FLAHanSinglen();
}
}
return m_pInstance;
}
};
//饿汉模式 都是线程安全 无内存泄露
class FEHanSinglen
{
private:
FEHanSinglen(){};
~FEHanSinglen()
{
if(m_pInstance != 0)
{
delete m_pInstance;
}
m_pInstance = 0;
};
static FEHanSinglen* m_pInstance;
public:
static FEHanSinglen* getInstance()
{
return m_pInstance;
}
};
FEHanSinglen* FEHanSinglen::m_pInstance = new FEHanSinglen();
void main()
{
FEHanSinglen::getInstance();
}