单例设计模式c++

什么是单例模式?

单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性

单例模式分类

单例模式可以分为懒汉式饿汉式 ,两者之间的区别在于创建实例的时间不同

  • 懒汉式 :指系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。(这种方式要考虑线程安全)
  • 饿汉式 :指系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)

单例类特点

  • 构造函数和析构函数为private 类型,目的禁止外部构造和析构
  • 拷贝构造和赋值构造函数为private 类型,目的是禁止外部拷贝和赋值,确保实例的唯一性

单例类的结构

  • 一个public的获取指向唯一的实例对象的指针的函数GetInstance()
  • 构造函数析构函数设为private,禁止外部构造和析构
  • 拷贝构造和赋值操作符重载函数设为private类型,禁止外部拷贝和赋值,确保实例的唯一性
  • 一个private的static的指向唯一的实例对象的指针

懒汉模式实现代码

线程不安全版本:

cpp 复制代码
//线程不安全的懒汉模式
class singleClass {
public:
	
	static singleClass* getinstance()//对外的接口(方法),静态成员函数调用静态成员变量
	{
		if (instance == nullptr)
		{
			instance = new singleClass();
		}
		return instance;
	};
 
private:
    static singleClass* instance;//静态成员变量,类内声明,类外初始化
	singleClass() {} //构造函数属性设置为私有
 
    singleClass(const singleClass & sc) {} //拷贝构造函数也需要设置为私有
};
singleClass* singleClass::instance=nullptr;//初始化静态变量
cpp 复制代码
//线程安全的懒汉模式
class lhsingleClass {
public:
	
	static lhsingleClass* getinstance()
	{//双重锁模式
		if (instance == nullptr)
		{//先判断是否为空,如果为空则进入,不为空说明已经存在实例,直接返回
            //进入后加锁
			i_mutex.lock();
			if (instance == nullptr)
			{//再判断一次,确保不会因为加锁期间多个线程同时进入
				instance = new lhsingleClass();
			}
			i_mutex.unlock();//解锁
		}
		return instance;
	}
private:
    static lhsingleClass* instance;
	static mutex i_mutex;//锁
	lhsingleClass(){}
    lhsingleClass(const lhsingleClass& sc) {}//拷贝构造函数也需要设置为私有
};
lhsingleClass* lhsingleClass::instance=nullptr;
mutex lhsingleClass::i_mutex;//类外初始化

饿汉模式实现代码

cpp 复制代码
//饿汉模式:不管用不用得到,都构造出来。本身就是线程安全的
class ehsingleClass {
public:
	static ehsingleClass* getinstance()
	{
		return instance;
	}
 
private:
    static ehsingleClass* instance;//静态成员变量必须类外初始化,只有一个
	ehsingleClass() {}
};
ehsingleClass* ehsingleClass::instance = new ehsingleClass();
//类外定义,main开始执行前,该对象就存在了
相关推荐
胡萝卜术6 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
亦暖筑序1 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
青禾网络3 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式
ZJPRENO4 天前
吃透软件开发六大设计原则,告别烂代码
设计模式
咖啡八杯4 天前
GoF设计模式——命令模式
java·设计模式·架构