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

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.xdnf.cn/news/6801.html

相关文章:

  • Day 22 训练
  • 01-多线程案例-线程安全问题
  • n8n 中文系列教程_23. 【实战篇】如何零成本搭建Deep Research类AI工具
  • MySQL8新特性
  • 【Vite】前端开发服务器的配置
  • 【Dv3Admin】插件 dv3admin_chatgpt 集成大语言模型智能模块
  • 深入理解 Git 分支操作的底层原理
  • 基于协同过滤的文学推荐系统设计【源码+文档+部署】
  • 机器学习第十五讲:决策树全面讲解:像玩“20个问题“游戏猜身份[特殊字符]
  • 逻辑复制环境删除订阅报错 replication slot does not exist
  • 源码与二进制包区别
  • foreach中使用await的问题
  • 【AI】用Dify实现一个模拟面试的功能
  • SD2351核心板:开启AI视觉普惠化新时代
  • AI 算力革命:算力的未来趋势
  • idea中Lombok失效的解决方案
  • 第31节:迁移学习概念
  • 2025年PMP 学习十五 第10章 项目资源管理
  • 应用层DDoS防护:从请求特征到行为链分析
  • 单例模式(Singleton Pattern)详解
  • 线程池设计
  • 码蹄集——圆包含
  • GraphPad Prism项目的管理
  • 兼容性测试的方法与实践要点
  • Qwen3技术报告
  • Axure疑难杂症:剖析面包屑导航“用户不迷路”(玩转导航)
  • 华为云Flexus+DeepSeek征文|基于Dify平台tiktok音乐领域热门短视频分析Ai agent
  • Unity雷火UX工具插件中的本地化功能(Unity项目中文字图片多语言功能)
  • Feign异步模式丢失上下文问题
  • 云轴科技ZStack官网上线Support AI,智能助手助力高效技术支持