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

版权声明:本文为博主原创文章,未经博主允许不得转载。文章中有连接失效或是技术谬误的地方,请与我联系。 https://blog.csdn.net/luchengtao11/article/details/82379039

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;
}

猜你喜欢

转载自blog.csdn.net/luchengtao11/article/details/82379039