首页 > 编程语言 >单例模式c++实现

单例模式c++实现

时间:2024-05-23 17:41:36浏览次数:24  
标签:std Singleton getInstance 模式 instance 实例 c++ 单例

单例模式是一种创建型设计模式,它保证一个类仅有一个实例,并提供一个全局访问点来访问这个唯一实例。下面是一个简单的C++实现单例模式的例子:

cpp

include

include

class Singleton {
private:
static Singleton* instance;
static std::mutex mtx;

Singleton() {} // 私有构造函数,防止外部创建实例
Singleton(const Singleton&) = delete; // 删除拷贝构造函数
Singleton& operator=(const Singleton&) = delete; // 删除赋值操作符

public:
static Singleton* getInstance() {
std::lock_guardstd::mutex lock(mtx); // 使用互斥锁保证线程安全
if (!instance) {
instance = new Singleton();
}
return instance;
}

void doSomething() {
    std::cout << "Singleton instance is doing something." << std::endl;
}

};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();

if (s1 == s2) {
    std::cout << "s1 and s2 are the same instance." << std::endl;
} else {
    std::cout << "s1 and s2 are not the same instance." << std::endl;
}

s1->doSomething();
s2->doSomething();

delete s1; // 注意:通常我们不会显式删除单例对象,除非你确定应用程序即将结束
return 0;

}
在这个例子中,我们使用了互斥锁(std::mutex)来保证在多线程环境下getInstance方法的线程安全性。当getInstance方法被首次调用时,它会创建一个新的Singleton实例并将其赋值给静态成员变量instance。在后续的调用中,getInstance方法会返回已经存在的实例。

注意,单例模式通常用于那些只需要一个实例的类,例如配置管理类、日志记录类等。然而,过度使用单例模式可能会导致代码难以理解和维护,因此在使用时应谨慎考虑。

标签:std,Singleton,getInstance,模式,instance,实例,c++,单例
From: https://www.cnblogs.com/donghao99/p/18209069

相关文章

  • 51单片机:PCA模块的PWM模式
    1、PWM功能引脚切换 2、配置PCA控制寄存器 3、配置PCA模式寄存器,选择时钟源 4、计数寄存器清零5、配置PCA模块模式模式控制寄存器6、配置PCA模块PWM模式控制寄存器7、配置比较值8、控制寄存器配置CR开始计数以6位PWM为例计数值CL[5:0]与CCAPnL[5:0]比较,小于输出低......
  • c++ 语法 引用
      引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。C++引用vs指针引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为......
  • C++ 的 mutable 引出的一系列思考
    阅读多线程实战第六章第二节时,看到mutable关键词的使用,突然忘记它的含义=>  https://github.com/xiaoweiChen/CPP-Concurrency-In-Action-2ed-2019/blob/master/content/chapter6/6.2-chinese.md 进而引申到mutable的使用=> C++的mutable关键字......
  • Linux C++ IDE
    在linux下开发C++一般使用cmake,而我们也需要一个IDE来提高开发效率,之前使用过VSCode,这个需要装各种插件进行许多配置才能成为一个真正的IDE,后来知道了Clion是一个更好的选择。那么我们怎么使用呢?官网下载安装包,可以试用一个月,然后我们可以去淘宝买个共享帐号,我......
  • c++ 迭代器
     c++迭代器,可以理解成指针的泛化。迭代器与指针:迭代器(Iterator)是指针(pointer)的泛化,提供了对对象的间接访问。迭代器针对容器,而指针类型针对数组。迭代器与模板:模板使得算法独立于存储的数据类型,即任何数据类型都可以使用该程序设计。而迭代器使得算法独立于使用的容器类型,即任......
  • Spring框架中都用到了哪些设计模式?
    这是一道相对有难度的题目,你不仅要回设计模式,还要知道每个设计模式在Spring中是如何使用的。简单工厂模式:Spring中的BeanFactory就是简单工厂模式的体现。根据传入一个唯一的标识来获得Bean对象,但是在传入参数后创建还是传入参数前创建,要根据具体情况来定。工厂模式:Spring......
  • C++类中封装指针函数
      classMyClass{public:voidfunc1(){//实现}voidfunc2(){//实现}//成员函数指针类型typedefvoid(MyClass::*MemberFuncPtr)();//一个成员函数指针成员变量MemberFuncPtrptrFunc;......
  • C++高性能服务器框架—协程模块
    协程模块概述一、概念可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的;对比首先介绍一下为什么要使用协程。从了解进程,线程,协程之间的区别开始。从定义来看进程是资源分配和拥有的基本单位。进程通过内存映射拥有独立的代......
  • C++实现128位整数类
    如何编写一个128位的整数现在的大部分的计算机编程语言都包含了64位的有符号整数和无符号整数,有的甚至还提供了128位的整数和大数,比如:\(C\#\):System.Int128,System.UInt128\(Rust\):i128,u128但是在C/C++中并未发现uint128_t/int128_t,尽管在某些平台下可以看到__int1......
  • [20] C++虚幻引擎热更新
    Day1大纲行为树节点网络PDF网络系统内容Task节点FinishWithResult:MoveDirectlyToWard:PushPawnAction:运行至当前队列节点首节点 RunBehaviorDynamic:动态运行子行为树SetTagCooldown:WaitBlackboardTime:装饰器节点GamePlayTagCondition......