静态构造单例、动态构造(带垃圾回收)单例和多件

1、单例模式:
构造函数私有,通过static的接口函数向外提供单例的访问。

2、单例模式的不同实现方式:
2.1、动态构造单例,垃圾回收析构:

class Singleton   
{   
public:      
	static Singleton* GetInstance()   
	{          
		if (m_Instance == nullptr) {  // 判断是否第一次调用     
			m_Instance = new Singleton();     
		}        
		return m_Instance;   
	}     
	~Singleton();  
private:     
	Singleton()  { static CGarbo Garbo; }     
	static Singleton* m_Instance;    
	class CGarbo       
	{ 
	public: 
		~CGarbo() {    
			if (Singleton::m_Instance) {     
				delete Singleton::m_Instance;     
				Singleton::m_Instance = nullptr;   
			}   
		}    
	};  
};   
Singleton* Singleton::m_Instance = nullptr; // 私有的静态成员变量也可以在类外初始化  

2.2、需要垃圾回收机制的原因:

  1. 使用new创建的(类)对象,在离开作用域时,该(类)对象的析构函数不被自动调用,而需要调用delete主动触发析构函数
  2. 因此没有垃圾回收机制的动态构造单例,在程序结束时析构函数不被调用,内存不会被释放。
  3. 利用静态变量在程序结束时析构,在其析构函数中主动调用单例模式的delete函数,完成单例的析构

参考资料:
1、为什么需要带垃圾回收机制的单例模式
2、常见单例与带垃圾回收机制的单例模式代码
3、为什么new的单例离开作用域析构函数不被调用

2.3、采用静态变量创建单例,自动析构:

class Singleton
{   
public:      
	static Singleton& getInstance()  
	{    
		static Singleton instance;       
		return instance;   
	}     
	void func() { cout<<"Singleton"<<endl; }  
private:   
	Singleton(){}       
	Singleton(const Singleton&) = delete;   
	Singleton& operator=(const Singleton&) = delete;  
};  

int main()  
{     
	Singleton& mysingleton = Singleton::getInstance();  
	mysingleton.func();       
	getchar();   
	return 0;  
} 

参考资料:
1、静态变量创建单例

3、多件模式:
类中有一个map对象保存键值与对应实例的指针。通过static的接口函数访问实例时,先利用传入的key查询是否已有该实例,有则直接返回,无则创建后,保存在map中并返回

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值