C++单例模式

什么是单例模式

单例模式是一种常见的设计模式,核心结构是只包含一个称为单例的特殊类,它的目的是保证一个类只有一个实例,并提供一个全局的访问点,该实例被所有程序模块共享,避免了类频繁创建和销毁。
它的用处也十分广泛,比如日志管理,操作系统的日志管理器。

怎么实现

为了保证这个类只实例化一次,所以设计思路需要把类的构造函数设置成private,类的内部在申请一个private该类的指针,然后对外需要提供一个public的接口,用来访问构造函数。需要注意的是需要把该类的指针和对外的接口设置成static,这样做的目的是加上这个关键字之后,该成员函数和成员就属于类而非对象。需要在类内申明,类外初始化

单例模式的分类

单例模式分为饿汉模式和懒汉模式
(1)饿汉模式:不管需不需要实例化对象,都先实例化,这样用的时候就不用实例化了,饿汉式是线程安全的,因为在线程创建之前就已经实例化了。代码如下:

//单例模式:饿汉模式
class singleton
{
private:
	singleton()
	{
		cout << "构造" << endl;
	}
	~singleton()
	{
		cout << "析构" << endl;
	}
	static singleton* p;
public:
	static singleton* instance();
	static void deleteInstance();
	int a;
};
singleton* singleton::p = new singleton();//类内定义,类外初始化
singleton* singleton::instance()
{
	return p;
}
void singleton::deleteInstance()
{
	delete p;
}
int main()
{
	singleton* s = singleton::instance();
	s->a = 10;
	cout << s->a << endl;
	return 0;
}

由于构造是私有的,所以为了避免内存泄漏,应该在定义一个私有的析构,并设置一个public接口访问它。
(2)懒汉模式:懒汉模式就是刚开始不实例化,什么时候使用它,什么时候实例化。instance()方法才去判断单例指针p,进而实例化单例指针p。代码如下:

class singleton
{
private:
	singleton()
	{
		cout << "构造" << endl;
	}
	~singleton()
	{
		cout << "析构" << endl;
	}
	static singleton* p;
	static mutex mutex;
public:
	static singleton* instance();
	static void deleteInstance();
	int a;
};
mutex singleton::mutex;
singleton* singleton::p = nullptr;
singleton* singleton::instance()
{
	if (p == nullptr)
	{
		mutex.lock();
		if (p == nullptr)
		{
			p = new singleton();
		}
		mutex.unlock();
	}
	return p;
}
void singleton::deleteInstance()
{
	delete p;
}
int main()
{
	singleton* s = singleton::instance();
	s->a = 10;
	cout << s->a << endl;
	singleton* s1 = singleton::instance();
	//s1->a = 20;
	cout << s1->a << endl;
	singleton::deleteInstance();
	return 0;
}

注意:这个需要考虑线程安全,就是当好几个线程同时实例化的时候,容易出现问题,所以需要加一个判断,并在判断的时候加锁,保证线程安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值