单例模式

定义:保证1个类仅有1个实例,并提供一个访问他的全局访问点

如果希望在系统中某个类的对象只能存在1个,那么就使用单例模式,比如配置类

主要解决了:全局使用的类频繁的创建与销毁

优点:避免了对资源的多重占用。在内存里只有1个实例,减少内存的开销,尤其是频繁的创建和销毁实例

---------------------------------------------------------------------------------------------------------------------------------

步骤:

1、将构造函数设为私有拷贝构造函数设置为私有(或者delete掉),赋值函数设置为私有(或者delete掉)

2、提供1个静态的访问唯一实例的接口

---------------------------------------------------------------------------------------------------------------------------------实现有2种:

  • 饿汉

直接在程序运行之前就初始化好了这个实例

class SingleTon2 {
public:
	//3、设置一个静态的访问实例接口  
	static SingleTon2* getInstance()
	{
		return data;
	}
private:
	//1、将构造函数和拷贝构造私有化
	SingleTon2() = default;
	SingleTon2(const SingleTon2& other) = default;
	SingleTon2& operator=(const SingleTon2& othe) = delete;
private:
	//2、指向本类的静态指针
	static SingleTon2* data;

};
//4、程序运行之前就对这个实例进行了初始化
SingleTon2* SingleTon2::data = new SingleTon2;
  • 懒汉

需要访问这个实例时才初始化这个实例

但是存在多线程访问仍然可能导致有多个实例的问题

class SingleTon {
public:
	//3、设置一个静态的访问实例接口  
	static SingleTon* getInstance()
	{
		///4、程序运行之后调用该接口访问这个实例时才对这个实例进行初始化
		if (data == nullptr)
		{
			data = new SingleTon;
		}
		return data;
	}
private:
	//1、将构造函数和拷贝构造、赋值函数私有化
	SingleTon() = default;
	SingleTon(const SingleTon& other) = default;//或者delete
	SingleTon& operator=(const SingleTon& othe) = delete;

private:
	//2、指向本类的静态指针
	static SingleTon* data;

};
SingleTon* SingleTon::data = nullptr;

使用局部静态变量解决线程安全问题

class SingleTon3 {
public:
	//2、设置一个静态的访问实例接口  
	static SingleTon3* getInstance()
	{
		//3、静态局部变量只会初始化一次 且生命周期整个程序运行期间
		static SingleTon3 data;
		return &data;
	}
private:
	//1、将构造函数和拷贝构造、赋值函数私有化
	SingleTon3() = default;
	SingleTon3(const SingleTon3& other) = default;//或者delete
	SingleTon3& operator=(const SingleTon3& othe) = delete;
};

还可以使用std::call_once解决多线程访问的问题

class SingleTon4 {
public:
	//3、设置一个静态的访问实例接口  
	static SingleTon4* getInstance()
	{
		///4、程序运行之后调用该接口访问这个实例时才对这个实例进行初始化
		if (data == nullptr)
		{
			//声明这个once_flag  搭配call_once保证只调用1次初始化操作
			static once_flag once;
			call_once(once, [&]() {data = new SingleTon4; });
		}
		return data;
	}
private:
	//1、将构造函数和拷贝构造、赋值函数私有化
	SingleTon4() = default;
	SingleTon4(const SingleTon4& other) = default;//或者delete
	SingleTon4& operator=(const SingleTon4& othe) = delete;

private:
	//2、指向本类的静态指针
	static SingleTon4* data;

};
SingleTon4* SingleTon4::data = nullptr;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值