我是靠谱客的博主 欣慰薯片,最近开发中收集的这篇文章主要介绍C++单例模式-懒汉与饿汉-四种情况,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(一)懒汉式
特点: 时间换空间
懒汉:故名思义,不到万不得已就不会去实例化对象,在第一次用到类实例的时候才会去实例化对象。
(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++单例模式-懒汉与饿汉-四种情况所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部