懒汉模式
cpp
class Singleton_lazy
{
public:
static Singleton_lazy* get()
{
if (sl == nullptr)
{
sl= new Singleton_lazy;
}
return sl;
}
class Garbo
{
~Garbo()
{
if(sl)
delete sl;
}
};
private:
Singleton_lazy(){}
static Singleton_lazy* sl;
static Garbo garbo;
};
Singleton_lazy* Singleton_lazy::sl = nullptr;
饿汉模式
cpp
class Singleton_hungry
{
public:
static Singleton_hungry* get()
{
return sh;
}
class Garbo
{
~Garbo()
{
if(sh)
delete sh;
}
};
private:
Singleton_hungry() {}
static Singleton_hungry* sh;
static Garbo garbo;
};
Singleton_hungry* Singleton_hungry::sh = new Singleton_hungry;
注:
1.把构造函数私有,是避免类外进行创建该对象。
2.把成员私有,避免类外直接对该静态成员进行赋值或者其他操作。
3.把成员写成静态是因为静态成员每个类只存在一份,保证了单例。
4.饿汉模式直接创建对象,该行为发生在main函数创建之前。
5.饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变,懒汉式不一定。
6.Garbo是垃圾回收类,当garbo对象出了作用域调用析构函数释放时,会顺带释放单例对象的资源。当然这个操作不是必要的,毕竟所占内存也特别小。