单例模式

本文介绍了单例模式的概念及其设计步骤,对比了懒汉式和饿汉式的实现方式,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式是一种对象创造型模式,使用单列模式可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

单例模式的设计步骤:

1、构造函数私有化。

2、提供一个全局的静态方法。

3、在类中定义一个静态指针,指向本类变量的静态变量指针。

单例的实现可以分为懒汉式和饿汉式,主要区别在于对象的创建时机的不同。懒汉式是在第一次使用对象时创建对象的,而饿汉式则在程序启动时就将对象创建好,无论是否对象。

#include<iostream>        //单列模式——懒汉模式
#include<pthread.h>
using namespace std;
pthread_mutex_t mutex;
class Singleton
{
private:
	static Singleton *mInstance;
	static int ObjectCount;
private:
	Singleton()  //构造函数必须申明为私有
	{
		
	}
public:
	static Singleton *GetInstance()     //提供给外部创建对象
	{
		ObjectCount++;
		if(mInstance==NULL)
		{
			usleep(10000);
			mInstance=new Singleton;  //在此处申请对象
		}
		return mInstance;
	}
	static int GetObjectCount()
	{
		return ObjectCount;
	}
	void release() //释放
	{
		ObjectCount--;
		if(ObjectCount==0&&mInstance!=NULL)
		{
			delete mInstance;
			mInstance=NULL;
		}
	}
};

Singleton *Singleton::mInstance=NULL;
int Singleton::ObjectCount=0;
void *Create(void *arg)
{
	pthread_mutex_lock(&mutex);       //加锁
	Singleton *s = Singleton::GetInstance();
	cout << s << endl;
	pthread_mutex_unlock(&mutex);
}
int main()
{
	/*Singleton *s1 = Singleton::GetInstance();
	Singleton *s2 = Singleton::GetInstance();
	Singleton *s3 = Singleton::GetInstance();
	Singleton *s4 = Singleton::GetInstance();
	Singleton *s5 = Singleton::GetInstance();
	Singleton *s6 = Singleton::GetInstance();
	
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
	
	cout << Singleton::GetObjectCount() << endl;*/
	pthread_mutex_init(&mutex,NULL);         //多线程时涉及线程同步等问题
	int ret;
	pthread_t tid[10];
	for (int i=0;i<10;i++)
	{
		ret=pthread_create(&tid[i],NULL,Create,NULL);
		if(ret!=0)
		{
			perror("pthread_create");
		}
	}
	void *status;
	for(int i=0;i<10;i++)
	{
		pthread_join(tid[i],&status);
	}
	pthread_mutex_destroy(&mutex);
	return 0;
}

饿汉模式

#include<iostream>        //单列模式——饿汉模式
#include<pthread.h>
using namespace std;
class Singleton
{
private:
	static Singleton *mInstance;
	static int ObjectCount;
private:
	Singleton()  //构造函数必须申明为私有
	{
		
	}
public:
	static Singleton *GetInstance()     //提供给外部创建对象
	{
		ObjectCount++;
		return mInstance;
	}
	static int GetObjectCount()
	{
		return ObjectCount;
	}
	void release() //释放
	{
		ObjectCount--;
		if(ObjectCount==0&&mInstance!=NULL)
		{
			delete mInstance;
			mInstance=NULL;
		}
	}
};

Singleton *Singleton::mInstance=new Singleton;  //在初始化时便申请对象,懒汉模式是在构造函数里进行申请对象
int Singleton::ObjectCount=0;
void *Create(void *arg)
{
	Singleton *s = Singleton::GetInstance();
	cout << s << endl;
}
int main()
{
	/*Singleton *s1 = Singleton::GetInstance();
	Singleton *s2 = Singleton::GetInstance();
	Singleton *s3 = Singleton::GetInstance();
	Singleton *s4 = Singleton::GetInstance();
	Singleton *s5 = Singleton::GetInstance();
	Singleton *s6 = Singleton::GetInstance();
	
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
	
	cout << Singleton::GetObjectCount() << endl;*/
	     //多线程时涉及线程同步等问题,饿汉模式时无影响
	int ret;
	pthread_t tid[10];
	for (int i=0;i<10;i++)
	{
		ret=pthread_create(&tid[i],NULL,Create,NULL);
		if(ret!=0)
		{
			perror("pthread_create");
		}
	}
	void *status;
	for(int i=0;i<10;i++)
	{
		pthread_join(tid[i],&status);
	}
	
	return 0;
}

在一定程度上,饿汉模式优于懒汉模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值