当前位置: 首页 > article >正文

单例模式入门

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个新对象, 此时你会获得之前已创建的对象, 而不是一个新对象。

普通构造函数无法实现上述行为, 因为构造函数的设计决定了它必须总是返回一个新对象。

还记得那些存储重要对象的全局变量吗? 它们在使用上十分方便, 但同时也非常不安全, 因为任何代码都有可能覆盖掉那些变量的内容, 从而引发程序崩溃。

和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。

还有一点: 你不会希望解决同一个问题的代码分散在程序各处的。 因此更好的方式是将其放在同一个类中, 特别是当其他代码已经依赖这个类时更应该如此。

在这里插入图片描述

在C++中,实现单例模式通常涉及以下几个步骤:

私有化构造函数:防止外部通过new关键字直接创建类的实例。
私有化拷贝构造函数和赋值运算符:防止通过拷贝或赋值创建新的实例。
创建一个静态的类成员变量:用于存储类的唯一实例。
提供一个静态的公有成员函数:用于获取类的唯一实例(通常称为getInstance)。
下面是一个简单的C++单例模式实现例子:

cpp
#include
#include // for std::unique_ptr

class Singleton {
public:
// 禁用拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

// 提供一个静态的公有成员函数来获取唯一实例
static Singleton& getInstance() {
    // 局部静态变量具有线程安全性(C++11及以后)
    static Singleton instance;
    return instance;
}

// 其他成员函数
void doSomething() {
    std::cout << "Doing something in Singleton!" << std::endl;
}

private:
// 私有化构造函数
Singleton() {
std::cout << “Singleton instance created!” << std::endl;
}

// 禁止析构函数被外部调用(虽然在这个例子中不是必须的,但可以作为一种防御性编程策略)
~Singleton() = default;

};

int main() {
// 获取单例实例并调用其成员函数
Singleton& singleton = Singleton::getInstance();
singleton.doSomething();

// 尝试获取另一个实例(实际上是同一个实例)
Singleton& anotherSingleton = Singleton::getInstance();
anotherSingleton.doSomething();

// 注意:在main函数结束时,局部静态变量(即单例实例)会自动销毁
return 0;

}
在这个例子中,Singleton类有一个私有的构造函数,这意味着你不能从类外部直接创建Singleton的实例。相反,你必须通过getInstance静态成员函数来获取类的唯一实例。这个函数检查是否已经创建了实例,如果没有,则创建一个新的实例并返回它;如果已经创建了实例,则直接返回该实例。

注意,在C++11及以后的版本中,局部静态变量的初始化是线程安全的,这意味着在多线程环境中调用getInstance函数时,不需要额外的同步机制来保证只有一个实例被创建。

此外,拷贝构造函数和赋值运算符被删除,以防止通过拷贝或赋值来创建新的Singleton实例。虽然在这个简单的例子中可能看起来不是必须的,但在更复杂的场景中,这是一种重要的防御性编程策略。

在这里插入图片描述

在这里插入图片描述


http://www.kler.cn/a/411810.html

相关文章:

  • 5.Feign与ReflectiveFeign
  • 如何提升编程能力第二篇
  • ArcGIS pro中的回归分析浅析(加更)关于广义线性回归工具的补充内容
  • 从ChatGPT到代理AI:安全领域的新变革
  • 蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)
  • 宇信科技JAVA笔试(2024-11-26日 全部AK)
  • 文件系统的作用
  • C++条件编译指令:#if、#elif、#ifdef、#ifndef、#elifdef、#elifndef、#else、#endif
  • On-Chip-Network之routing
  • [HarmonyOS] 解决HMRouter路由地址无法抽取的问题
  • C#上机练习66-70
  • 网络安全防范
  • 鸿蒙HarmonyOS学习笔记(4)
  • 3D导航案例
  • 钉钉与企业微信机器人:助力网站定时任务高效实现
  • RTMP协议
  • 基于matlab的电力系统潮流计算
  • js中this的指向问题
  • 代码随想录算法训练营第五十八天|Day58 图论
  • JavaScript的运算符与Python的对比
  • leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现
  • 【AI技术赋能有限元分析应用实践】FEniCS 安装在Ubuntu路径实现python调用
  • leetcode.3206 交替组Ⅰ
  • Spring Bean初始化流程
  • linux安装mysql8.0.40
  • Mairadb 最大连接数、当前连接数 查询