单例模式简单实现

#pragma once
#include <mutex>
#include <thread>
#include <iostream>
using namespace std;
//饿汉模式,类产生的时候就创建实例
class Singleton
{
public:
	static Singleton* GetInstance() {
		return &m_instance;
	}
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
private:
	Singleton() {};
	static Singleton m_instance;
};
Singleton Singleton::m_instance;

//Meyers' Singleton
class Singleton2
{
private:
	Singleton(){};
	~Singleton(){};
	Singleton(const Singleton&){};
	Singleton& operator=(const Singleton&){};
public:
	static Singleton& getInstance(){
		static Singleton instance;
		return instance;
	}
}

//懒汉模式,用到的时候才实例化
class Singleton1
{
public:
	static Singleton1* GetInstance() {
		//保证性能,如果没有这个if,每个线程都得等锁
		if (m_Singleton1==nullptr)
		{
			m_mtx.lock();
			//保证只生成一个实例
			if (m_Singleton1 == nullptr) {
				m_Singleton1 = new Singleton1();
			}
			m_mtx.unlock();
		}
		return m_Singleton1;
	}
	//防止拷贝
	Singleton1(const Singleton1&) = delete;
	Singleton1& operator=(const Singleton1&) = delete;
	
private:
	Singleton1() { cout << "construct" << endl; }
	~Singleton1() { 
		cout << "destruct" << endl; 
	}
	static Singleton1* m_Singleton1;
	static mutex m_mtx;
	//定义一个用来释放内存的类
	class CGarbo {
	public:
		CGarbo() {};
		~CGarbo() {
			if (m_Singleton1 != nullptr)
			{
				delete m_Singleton1;
				m_Singleton1 = nullptr;
			}
		}
	};
	//定义一个释放内存类的静态对象
	//当该对象销毁时,就释放m_Singleton1指向的堆区资源
	static CGarbo m_garbo;
};
//static 成员变量必须在类声明的外部初始化.没有在类外初始化的 static 成员变量不能使用。
Singleton1* Singleton1::m_Singleton1 = nullptr;
mutex Singleton1::m_mtx;
Singleton1::CGarbo Singleton1::m_garbo;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值