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

C++:单例模式

单例模式就是只能有一个实例化的对象的类。

当需要确保只有一个实例时,就要用到单例模式。

比如,当我们在项目中运用网络和数据库时,为了避免多模块重复创建网络连接或数据库实例,导致的资源浪费,我们就可以运用单例模式。

再比如,某些应用程序需要维护一个全局状态,例如游戏中的玩家信息、电子商务系统中的购物车。单例模式可以提供一个全局唯一的状态容器。

他的优点有:

保证实例唯一性,避免资源浪费。

提供全局访问点,简化代码结构。

可以严格控制客户端如何访问和使用实例。

缺点:

可能导致代码耦合度高,违反单一职责原则。

多线程环境下需要处理线程安全问题。

单元测试可能更困难,因为单例可能影响测试的独立性。

单例模式的实现:

#include<iostream>
using namespace std;class Object
{
private:static Object* pobject;
private:Object(){}Object(Object& ro){}
public:~Object(){if (pobject != NULL){pobject = NULL;}}
public:static Object* GreatObject(){if (pobject == NULL){pobject = new Object;}return pobject;}};Object* Object::pobject = NULL;
int main()
{Object* p1 =Object:: GreatObject();Object* p2 =Object:: GreatObject();return 0;
}

以上代码是单例模式中的懒汉模式:在第一次调用时检查并创建实例

除了懒汉模式还有饿汉模式。

特性饿汉模式(Eager)懒汉模式(Lazy)
实例创建时机类加载时创建首次调用时创建
线程安全性天然线程安全(由类加载机制保证)非线程安全(需额外同步措施)
资源利用率可能浪费资源(即使未使用也会创建)资源利用率高(按需创建)
实现复杂度简单(无需考虑线程同步)复杂(需处理线程安全和内存管理)
适用场景单例对象初始化开销小、必须提前创建初始化开销大、实例使用频率不确定

饿汉模式的实现:

#include<iostream>
using namespace std;class Object
{
private:// 静态实例对象,在类加载时初始化static Object instance;private:// 私有构造函数Object(){}// 禁用拷贝构造函数Object(const Object&) = delete;// 禁用赋值运算符Object& operator=(const Object&) = delete;public:// 析构函数不需要处理实例释放~Object() = default;// 全局访问点,返回静态实例的引用static Object& getInstance(){return instance;}
};// 静态成员的初始化,在类外进行
Object Object::instance;int main()
{// 通过引用获取单例对象Object& obj1 = Object::getInstance();Object& obj2 = Object::getInstance();// 输出验证地址相同cout << "obj1 address: " << &obj1 << endl;cout << "obj2 address: " << &obj2 << endl;return 0;
}    
http://www.dtcms.com/a/194485.html

相关文章:

  • 【数据仓库面试题合集①】数据建模高频面试题及解析
  • 索恩格汽车SEG Automotive EDI 需求分析
  • Unity3D 游戏编程内存优化技巧
  • linux下tcp/ip网络通信笔记1,
  • Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)
  • 7. 进程控制-进程替换
  • 科技项目验收测试对软件产品和企业分别有哪些好处?
  • 填孔即可靠:猎板PCB如何用树脂塞孔重构高速电路设计规则
  • 安装Minikube
  • 芍药BAHD酰基转移酶-文献精读128
  • Vue2项目created不执行
  • Java视频流RTMP/RTSP协议解析与实战代码
  • JavaSE基础语法之方法
  • Hue面试内容整理-Hue 架构与前后端通信
  • LLaMA-Factory微调大模型Qwen2.5
  • 电动汽车直流快充充电桩AEV200-DC240M4的详细介绍
  • mysql-单一的事务--single-transaction选项
  • MyBatis进阶干货知识
  • 海康相机连接测试-极简版
  • K8s CoreDNS 核心知识点总结
  • AI 来袭:颠覆传统的数字营销指南
  • 我用 CodeBuddy 开发了一个颜色命名搜索器 —— ColorNameHub 的诞生记
  • Verilog HDL 语言整理
  • [特殊字符] 如何优雅地避免 SQL 多表 LEFT JOIN 造成的笛卡尔积放大问题?
  • 青少年编程与数学 02-019 Rust 编程基础 16课题、包、单元包及模块
  • C# RSA加密
  • 日语简单记录
  • 基于大模型预测的脑出血全流程诊疗技术方案
  • 服务器性能参数分析基础:磁盘-CPU-内存
  • ci/cd全流程实操