C++中的单例模式

C++的单例模式

  • 概念

      单例模式是一种常用的软件设计模式。它的核心结构只包含一个被称为单例的特殊类。
      它的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有的程序模块共享。
    
  • 应用场景
    在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置文件由一个单例对象统一读取,服务器进程中的其他对象通过这个单例对象获取这些配置信息。

  • 实现方式
    饿汉模式:不管将来是否使用,在程序启动时就创建唯一的一个实例对象

class Singleton{
public:
	static Singleton& getInstance(){
		return inStance;
	}
private:
	Singleton() {
		std::cout << "Singleton():" << this << std::endl;
	}
	
	//防拷贝
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
private:
	static Singleton inStance;
};

Singleton Singleton::inStance; //静态对象类外初始化

饿汉模式将构造函数私有化,提供一个静态函数获取静态对象,保证一个类仅有一个实例,但是如果单例对象构造时十分耗时并且占用很多资源,在程序一开始进行加载时会导致程序启动非常缓慢,这时候就需要用到懒汉模式。

懒汉模式:不必在程序一开始就创建实例,保证在使用之前创建好即可。

class Singleton{
public:
	static Singleton* getInstance(){
		if(p_inStance == nullptr){
			p_inStance = new Singleton();
		}
		return p_inStance;
	}
private:
	Singleton(){
		std::cout << "Singleton()" << this << std::endl;
	}
	
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
private:
	static Singleton* p_inStance;
};

Singleton* Singleton::p_inStance = nullptr;

当一个程序运行起来不免会用到线程,当有好多个线程来初始化实例时就不得不考虑线程安全,使用互斥锁来保证线程安全。

class Singleton{
public:
	static Singleton* getInstance(){
		if(p_inStance == nullptr){ //减少线程阻塞
			m_mutex.lock();
			if(p_inStance == nullptr){
				p_inStance = new Singleton();
			}
			m_mutex.unlock();
		}
		return p_inStance;
	}
	
	class GC{
	public:
		~GC(){ //垃圾回收类
			if(p_inStance != nullptr){
				delete p_inStance;
			}
		}
	};
	
	static GC gc; //定义静态成员变量,当程序结束时,系统自动调用析构函数
private:
	Singleton(){
		std::cout << "Singleton()" << this << std::endl;
	}
	
	Singleton(const Singleton&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	
private:
	static Singleton* p_inStance;
	static std::mutex m_mutex;
};

Singleton* Singleton::p_inStance = nullptr;
std::mutex Singleton::m_mutex;
Singleton::GC Singleton::gc;
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值