【c++】单例模式

1.单例模式介绍

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

2.饿汉模式

1)简单了解

“饿汉”很饿便会饥不择食,饿汉模式是指就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞 争,提高响应速度更好。

2)优点:简单

3)缺点:启动时可能有负载导致启动很慢

4)代码实现

#include<iostream>
#include<stdlib.h>
using namespace std;


class Singleton
{
public:
	static Singleton* GetInstance()
	{
		return &m_instance;
	}

	//static Singleton& GetInstance()
	//{
	//	return m_Instance;
	//}


private:
	Singleton()//构造函数私有化可以使别的地方不能创建对象
	{}

	//防拷贝C++98
	//Singleton(const Singleton&);
	//Singleton& operator=(const Singleton&);//声明但不定义

	//防拷贝C++11
	Singleton(const Singleton&) = delete;
	Singleton& operator = (const Singleton&) = delete;

	static Singleton  m_instance;

};

Singleton Singleton::m_instance;//main之前就创建

int main()
{
	//Singleton s1 = *Singleton::Getinstance();//运算符重载被显示的声明为已删除函数并且是私有的
	//Singleton copy(*Singleton::GetInstance());//该句会出错,拷贝构造已经私有化
	system("pause");
	return 0;
}

3.懒汉模式

1)简单了解

“懒汉”就是比较懒,别人不催永远不会主动做事。懒汉模式就是指第一次使用对象时才会创建对象。
如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等 等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时 非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好。

2)代码实现

#include<iostream>
#include<stdlib.h>
#include<mutex>
using namespace std;


class Singleton
{
public:
	static Singleton* GetInstance(){
		//使用双锁,可以提高效率,如果没有双检查,原本并行的现场到这里都变成串行的,保证线程的安全性
		if (nullptr == m_pInstance){
			m_mtx.lock();//一次进一个
			if (nullptr == m_pInstance){
				m_pInstance = new Singleton();
			}
			m_mtx.unlock();
		}
		return  m_pInstance;
	}

	//程序在结束的时候,系统会自动析构所有的全局变量和所有的类的静态成员变量。
	//实现一个内嵌垃圾回收类,删除实例的对象。
	class CGarbo{
	public:
		~CGarbo(){
			if (Singleton::m_pInstance)
				delete Singleton::m_pInstance;
		}
	};
	// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
	static CGarbo Garbo;


private:   
	// 构造函数私有  
	Singleton(){};

	 //防拷贝 C++98
	//Singleton(const Singleton&);
	//Singleton& operator=(const Singleton&);//声明不定义
	
	// 防拷贝 C++11
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;

	static Singleton* m_pInstance; // 单例对象指针   
	static mutex m_mtx;            //互斥锁 



};

Singleton* Singleton::m_pInstance = nullptr; 
Singleton::CGarbo Garbo; 
mutex Singleton::m_mtx;





int main()
{
	//Singleton copy(*Singleton::GetInstance());//该句会出错
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41892460/article/details/83755329