C++单例模式的五种实现

本文详细介绍了五种不同的单例模式实现方式,包括懒汉式、饿汉式等,并对比了它们之间的特点,如线程安全性、内存管理及对象存放位置等。

Singleton.h 

#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <mutex>
/****************************第一种实现*******************************************/

/*
懒汉
1.线程不安全
2.内存泄露
3.用到时被初始化
3.对象在堆中
*/
class CSingleton1
{
public:
	static CSingleton1* Instance();
private:
	CSingleton1(const CSingleton1&);
	CSingleton1 & operator =(const CSingleton1 &);
	static CSingleton1 * instance;
	CSingleton1();

};



/****************************第二种实现*******************************************/

/*
饿汉
1、一开始便初始化
2、析构函数完成垃圾回收
3、线程安全
4、对象在堆中
*/
class CSingleton2
{
public:
	static CSingleton2 * Instance();
	class CGarbo
	{
	public:
		~CGarbo();
	};

private:
	static CSingleton2 *instance;
	static CGarbo garbo;
};
/****************************第三种实现******************************************
1.一开始便初始化
2.对象在静态区
3.程序结束时自动释放静态区的成员变量
4.线程安全
*/
class CSingleton3 
{
public:
	static CSingleton3 * Instance();
private:
	CSingleton3();
	static CSingleton3 instance;
};

/****************************第四种实现******************************************
1.运行时生成
2.线程安全
3.对象在堆中
4.程序结束自动释放
*/
class CSingleton4
{
public:

	static CSingleton4 * Instance();
private:
	CSingleton4();
};

/****************************第五种实现******************************************
1.运行时生成
2.线程安全
3.对象在堆中
4.程序结束自动释放
*/


class CSingleton5
{
public:
	static CSingleton5* Instance();
private:
	static CSingleton5* instance;
	static std::mutex mutex_;
	CSingleton5();
};
#endif // !_SINGLETON_H_

Singleton.cpp

#include <iostream>
#include "Singleton.h"

CSingleton1 * CSingleton1::Instance()
{
	if (instance == NULL)
	{
		instance = new CSingleton1();
	}
	return instance;
}
CSingleton1::CSingleton1()
{

}
//私有静态成员变量要手动初始化
CSingleton1 * CSingleton1::instance = NULL;//此句一定要写,否则会引起无法解析的外部符号错误



CSingleton2 * CSingleton2::Instance()
{
	return instance;
}

CSingleton2::CGarbo::~CGarbo()
{
	if (instance)
	{
		delete instance;
	}
}

CSingleton2 * CSingleton2::instance = new CSingleton2();
CSingleton2::CGarbo CSingleton2::garbo;

CSingleton3 * CSingleton3::Instance()
{
	return &instance;
}
CSingleton3::CSingleton3() {};

CSingleton3 CSingleton3::instance;

CSingleton4 * CSingleton4::Instance()
{
	static CSingleton4 instance;
	return &instance;
}
CSingleton4::CSingleton4() {};

CSingleton5::CSingleton5() {};
CSingleton5* CSingleton5::instance=NULL;
std::mutex CSingleton5::mutex_;
CSingleton5* CSingleton5::Instance()
{
	if (instance==NULL)
	{
		mutex_.lock();
		if (instance == NULL)//第二次
		{
			instance = new CSingleton5();
		}
		mutex_.unlock();
	}
	return instance;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值