Singleton模式分为两种模式,懒汉模式和饿汉模式。顾名思义,懒汉模式就是在需要类的对象时再去产生对象,而饿汉模式就是在类初始化时就已经产生了一个类对象,不管我们需不需要这个对象,这个对象自始至终就在那里。
懒汉模式:
优点:可以实现延迟实例化
缺点:多线程环境下需要特殊处理、较饿汉模式有性能问题。
饿汉模式:
优点:不用考虑多线程问题,也有比较好的性能
缺点:不能实现延迟实例化
写法一、只适用于单线程环境懒汉模式
//只适用于单线程的懒汉模式
class Singleton1
{
public:
static Singleton1 *getInstance()
{
if ( instance == NULL )
{
instance = new Singleton1();
}
return instance;
}
private:
Singleton1() {}
static Singleton1 *instance;
};
Singleton1 *Singleton1::instance = NULL;
写法二、懒汉模式在多线程环境下的几种解决方案
//性能不足的加锁处理
class Singleton2
{
public:
static Singleton2 *getInstance()
{
lock();
if ( instance == NULL )
{
instance = new Singleton2();
}
unlock();
return instance;
}
private:
Singleton2() {}
static Singleton2 *instance;
};
Singleton2 *Singleton2::instance = NULL;
//最理想的加锁处理 双检锁
class Singleton3
{
public:
static Singleton3 *getInstance()
{
if ( instance == NULL )
{
lock();
if ( instance == NULL )
{
instance = new Singleton3();
}
unlock();
}
return instance;
}
private:
Singleton3() {}
static Singleton3 *instance;
};
Singleton3 *Singleton3::instance = NULL;
写法三、饿汉模式
//饿汉模式
class Singleton4
{
public:
static Singleton4 *getInstance()
{
return instance;
}
private:
Singleton4() {}
static Singleton4 *instance;
};
Singleton4 *Singleton4::instance = new Singleton4();