概述
(一)懒汉式
特点: 时间换空间
懒汉:故名思义,不到万不得已就不会去实例化对象,在第一次用到类实例的时候才会去实例化对象。
(a)构造函数声明为private或protect防止被外部函数实例化。
(b)内部保存一个private static的指针ptr,保存全局唯一的实例对象。
(c)实例化的动作由一个public的方法代劳,该方法返回单例类唯一的实例对象。
缺点:
该方法不是线程安全的,当两个线程同时首次调用Instance方法,并且同时检测到ptr是NULL值,
则两个线程会同时构造一个实例给ptr。
class Singleton
{
private:
Singleton(){}
public:
static Singleton* Instance();//这里是声明,需要在类的外面定义
private:
static Singleton* ptr; //这里是声明,需要在类的外面定义
};
Singleton* Singleton::ptr = NULL; //这里是定义,分配内存
Singleton* Singleton::Instance() //这里是定义,分配内存
{
if (ptr == NULL)
{
ptr = new Singleton;
}
return ptr;
}
(二)线程安全的懒汉式–加锁
class Singleton
{
private:
Singleton()
{
pthread_mutex_init(&mutex);
}
public:
static pthread_mutex_t mutex; //这里是声明,需要在类的外面定义
static Singleton* Instance(); //这里是声明,需要在类的外面定义
private:
static Singleton* ptr; //这里是声明,需要在类的外面定义
};
pthread_mutex_t Singleton::mutex; //这里是定义,分配内存
Singleton* Singleton::ptr = NULL; //这里是定义,分配内存
Singleton* Singleton::Instance() //这里是定义,分配内存
{
if (ptr == NULL)
{
pthread_mutex_lock(&mutex);
if (ptr == NULL)
{
ptr = new Singleton;
}
pthread_mutex_unlock(&mutex);
}
return ptr;
}
(三)线程安全的懒汉式–内部静态变量
在Instance方法里定义一个静态的实例,可以保证拥有唯一实例,在返回时只需要返回其指针就可以了。
推荐这种实现方法。
class Singleton
{
private:
Singleton() {}
public:
static Singleton* Instance(); //这里是声明,需要在类的外面定义
};
Singleton* Singleton::Instance() //这里是定义,分配内存
{
static Singleton obj;
return &obj;
}
(四)饿汉式
特点:空间换时间
饿汉:在单例类定义的时候就进行实例化对象。
(a)构造函数声明为private或protect防止被外部函数实例化。
(b)内部保存一个private static的指针ptr,保存全局唯一的实例对象。
(c)实例化的动作由一个public的方法代劳,该方法返回单例类唯一的实例对象。
class Singleton
{
private:
Singleton(){}
public:
static Singleton* Instance(); //这里是声明,需要在类的外面定义
private:
static Singleton* ptr; //这里是声明,需要在类的外面定义
};
Singleton* Singleton::ptr = new Singleton; //这里是定义,分配内存
Singleton* Singleton::Instance() //这里是定义,分配内存
{
return ptr;
}
特点与选择:
在访问量较小时,采用懒汉实现,这是以时间换空间。
在访问量比较大,采用饿汉实现,这是以空间换时间。
最后
以上就是欣慰薯片为你收集整理的C++单例模式-懒汉与饿汉-四种情况的全部内容,希望文章能够帮你解决C++单例模式-懒汉与饿汉-四种情况所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复