饿汉式:
饿汉式即在程序直接就会创建一个实例对象,他不是取决于你用不用他,而是本来就有的,上代码一看就明白:
class SingleObject
{
public:
static SingleObject* GetInstance()
{
return &m_instance;
}
private:
// 构造函数私有
SingleObject() {};
SingleObject( SingleObject const&);
SingleObject& operator=( SingleObject const&);
static SingleObject m_instance;
};
SingleObject SingleObject::m_instance;
可以看到在类内声明了一个静态的类对象(类内声明,类外定义)。其实开始我有点疑惑:类内可以声明本类对象?这难道不是使用了不完整的类型吗?但是仔细想一下就会发现,
静态成员是类内声明,类外定义,也就是说在定义m_instance的时候已经是一个完整类型了,类似于在类成员函数中定义类对象是一个道理
静态成员以及函数是不占用类空间的。但是普通成员不行,因为普通成员函数并不是类外定义,占用类空间。
由于构造函数,拷贝构造等都被私有化,所以类外只能通过公共接口GetInstance()来获取唯一的一个实例。从代码可以看出,在你获取它之前,这个实例对象就已经存在了(可以与懒汉式对比着看)
懒汉式:
class SingleObject
{
private:
SingleObject() {};//构造私有
SingleObject(SingleObject const& s);//拷贝构造私有
SingleObject& operator=(SingleObject const&); //符号重载私有
private:
static SingleObject* SinOb;
public:
static SingleObject* getSinOb()
{
if (SinOb == nullptr)
{
SinOb = new SingleObject();
}
return SinOb;
}
public:
~SingleObject() {
delete SinOb;
SinOb = nullptr;
}
};
SingleObject* SingleObject::SinOb=nullptr;
此处不考虑线程安全。
可以看到懒汉式是当你第一次获取实例时它才会定义对象,以后每次当你获取实例它都会返回已有对象。
懒汉式在多线程中会产生问题,但这里就不做过多讨论了。
另外,这是之前写的,这里的代码还缺少了一个回收环节,应该在类中嵌套一个回收类用于回收实例!注意:不能在析构函数中回收,那会导致在回收的时候陷入循环
记录学习过程,如有错误,烦请指正,谢谢,啾咪