博客
关于我
设计模式 --- 单例模式(Singleton)
阅读量:220 次
发布时间:2019-03-01

本文共 1827 字,大约阅读时间需要 6 分钟。

单例模式是一种软件设计模式,其核心思想是确保在程序的任何地方,一个类只能有一个实例对象。这一模式特别适用于那些在程序中需要频繁使用且功能相对单一的类,例如数据库连接管理、资源配置等场景。

单例模式的主要优势在于能够有效管理内存资源,避免不必要的重复加载和占用内存空间。例如,假设有一个类的职责是将数据库加载到内存中并提供只读接口给其他组件使用。如果不采用单例模式,每次生成该类对象时都需要重新加载数据库,会导致内存占用重复,影响系统性能。

在C++11中,实现单例模式有多种方式。以下是常见的三种实现方法:

  • 从stack上分配内存,并返回类对象的引用

    这种实现方式通过使用静态变量来管理单例对象,确保每次调用返回同一个实例。代码示例如下:

    class Database {protected:   Database() {}public:   static Database& get() {      static Database database; // 静态变量      return database;   }   Database(Database const&) = delete;   Database(Database&) = delete;   Database& operator=(Database const&) = delete;   Database& operator=(Database&) = delete;};

    通过在get()方法中定义静态对象database,确保每次调用get()返回的都是同一个实例。这种实现方式在C++11中是线程安全的,但在低于C++11的编译器版本中,可能需要额外的锁机制来保证线程安全。

  • 从heap上分配内存,同样返回引用

    这种实现方式通过动态内存分配来管理单例对象。代码示例如下:

    class Database {protected:   Database() {}public:   static Database& get() {      static Database* pDatabase = new Database(); // 静态指针      return *pDatabase;   }   Database(Database const&) = delete;   Database(Database&) = delete;   Database& operator=(Database const&) = delete;   Database& operator=(Database&) = delete;};

    通过静态指针pDatabase管理单例对象,确保每次调用get()返回同一个实例。这种实现方式在内存管理上相对低效,但在某些特定场景下可能更具灵活性。

  • 返回指针

    这种实现方式通过返回指针来间接管理单例对象。代码示例如下:

    class Database {protected:   Database() {}public:   static Database* get() {      static Database* pDatabase = new Database(); // 静态指针      return pDatabase;   }   Database(Database const&) = delete;   Database(Database&) = delete;   Database& operator=(Database const&) = delete;   Database& operator=(Database&) = delete;};

    通过静态指针pDatabase管理单例对象,确保每次调用get()返回同一个实例。这种实现方式与第二种方法类似,但直接返回指针可能会带来一定的内存管理风险。

  • 需要注意的是,以上实现方式都通过删除构造函数和赋值操作来防止用户从其他地方创建新的实例,从而强制性地将单例模式的控制权掌握在get()方法中。这种设计方式虽然保证了单例模式的实现,但也需要谨慎处理异常情况和内存释放。

    总的来说,单例模式通过确保类只能有一个实例化对象,有效地减少了内存占用和资源浪费,提升了程序的性能和稳定性。在实际开发中,可以根据具体需求选择合适的实现方式,并结合线程安全的需求进行必要的优化。

    转载地址:http://ziav.baihongyu.com/

    你可能感兴趣的文章
    postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
    查看>>
    postgresql 主从配置_生产环境postgresql主从环境配置
    查看>>
    postgresql 函数&存储过程 ; 递归查询
    查看>>
    PostgreSQL 分组聚合查询中 filter 子句替换 case when
    查看>>
    PostgreSQL 同步流复制锁瓶颈分析
    查看>>
    PostgreSQL 备份与还原命令 pg_dump
    查看>>
    Postgresql 外部表插件postgres_fdw的安装和使用
    查看>>
    PostgreSQL 如何从崩溃状态恢复(上)
    查看>>
    PostgreSQL 存储过程基本语法
    查看>>
    PostgreSQL 实现批量更新、删除、插入
    查看>>
    PostgreSQL 导入 .gz 备份文件
    查看>>
    PostgreSQL 批量插入&更新数据时报错(ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time)
    查看>>
    PostgreSQL 新增数据返回自增ID
    查看>>
    postgresql 更新多列数据
    查看>>
    PostgreSQL 服务启动后停止
    查看>>
    PostgreSQL 辟谣存在任意代码执行漏洞:消息不实
    查看>>
    PostgreSQL+PostGIS实现两坐标点之间最短路径查询算法函数(地图工具篇.12)
    查看>>
    Qt开发——简易调色板QPalette
    查看>>
    PostgreSQL-解决连接时遇到的乱码问题
    查看>>
    PostgreSQL15.2最新版本安装_远程连接_Navicat操作_pgAdmin操作_Windows10上安装---PostgreSQL工作笔记001
    查看>>