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

设计模式-singleton

定义

Singleton设计模式是一种责任型模式,它通过隐藏构造器并提供一个对创建对象的单个访问点,确保某个类只有一个实例,并且提供了一个全局访问点。这种模式的宗旨是集中类的职责——创建一个担当独一无二角色的对象(生产唯一实例)。

实现举例

用C++(c++11)实现Singleton设计模式的示例代码:

#include <iostream>
#include <mutex>class Singleton {
public:static Singleton& getInstance() {std::call_once(initInstanceFlag, &Singleton::initSingleton);return *instance;}void setValue(int value) {this->value = value;}int getValue() const {return value;}private:Singleton() {}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static void initSingleton() {instance = new Singleton();}int value;static Singleton* instance;static std::once_flag initInstanceFlag;
};Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;int main() {Singleton& singleton1 = Singleton::getInstance();Singleton& singleton2 = Singleton::getInstance();singleton1.setValue(10);std::cout << singleton2.getValue() << std::endl; // 输出10singleton2.setValue(20);std::cout << singleton1.getValue() << std::endl; // 输出20return 0;
}

代码中使用std::call_once来保证只有一个线程可以初始化单例对象。

总结

Singleton设计模式以下特性:

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

这种模式的宗旨是集中类的职责——创建一个担当独一无二角色的对象(生产唯一实例)——在类的单个实例中。如果有讲的不对,可以评论留言,一起学习

相关文章:

  • pandas教程:Date and Time Data Types and Tools 日期和时间数据类型及其工具
  • 深度学习中文汉字识别 计算机竞赛
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • 腾讯云服务器公网带宽速度怎么样?上传下载实测!
  • 五、hdfs常见权限问题
  • 苍穹外卖--新增菜品
  • 【数据挖掘 机器学习 | 时间序列】时间序列必学模型: ARIMA超详细讲解
  • Windows 下 Sublime Text 2.0.2 下载及配置
  • fusion 360制作机械臂
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • adb shell settings高级指令设置系统属性所有的指令汇总+注释
  • Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用
  • 【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
  • ChatGPT简介及基本概念
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【技术性】Search知识
  • 345-反转字符串中的元音字母
  • DOM的那些事
  • ERLANG 网工修炼笔记 ---- UDP
  • es的写入过程
  • Fastjson的基本使用方法大全
  • Java精华积累:初学者都应该搞懂的问题
  • JS变量作用域
  • Linux快速复制或删除大量小文件
  • Python中eval与exec的使用及区别
  • QQ浏览器x5内核的兼容性问题
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vultr 教程目录
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 爱情 北京女病人
  • 半理解系列--Promise的进化史
  • 高程读书笔记 第六章 面向对象程序设计
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我有几个粽子,和一个故事
  • 学习ES6 变量的解构赋值
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 中文输入法与React文本输入框的问题与解决方案
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • # C++之functional库用法整理
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #13 yum、编译安装与sed命令的使用
  • #宝哥教你#查看jquery绑定的事件函数
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (TOJ2804)Even? Odd?
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)ABI是什么
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET Core 项目指定SDK版本