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

C++设计模式 单例模式

单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。下面是一个使用 C++11 特性编写的线程安全的单例模式示例:

#include <iostream>
#include <mutex> // For thread safety
#include <memory>

class Singleton {
public:
    static Singleton& getInstance() {
        std::call_once(initInstanceFlag, &Singleton::initSingleton);
        return *instance;
    }

    void doSomething() {
        std::cout << "Doing something useful.\n";
    }

public:

    // Prevent move constructor and move assignment operator from being used
    Singleton(Singleton&&) = delete;
    Singleton& operator=(Singleton&&) = delete;

    Singleton() {} // Constructor is private

    static void initSingleton() {
        instance = std::make_unique<Singleton>();
    }


    // Disable copy constructor and assignment operator
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    static std::unique_ptr<Singleton> instance;
    static std::once_flag initInstanceFlag;

};

// Initialize static members
std::unique_ptr<Singleton> Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;

int main() {
    Singleton& s = Singleton::getInstance();
    s.doSomething();

    return 0;
}

在这个例子中:

  • getInstance() 是一个静态成员函数,用于获取 Singleton 类的唯一实例。它使用了 std::call_once 来确保只初始化一次,并且在多线程环境下是安全的。
  • doSomething() 是一个示例功能函数。
  • 使用了 std::unique_ptr 来管理单例对象的生命周期,这样可以自动释放内存,防止内存泄漏。
  • 删除了拷贝构造函数、赋值运算符以及移动构造函数和移动赋值运算符来禁止复制或移动单例对象。

http://www.kler.cn/news/354395.html

相关文章:

  • 滚雪球学Redis[6.2讲]:Redis脚本与Lua:深入掌握Redis中的高效编程技巧
  • ModuleNotFoundError: No module named ‘pdfminer.high_level‘
  • buffer/cache内存优化_posix_fadvise_主动释放读缓存cache
  • 安卓开发中轮播图和其指示器的设置
  • 云原生后端高阶用法
  • PHP爬虫:从入门到精通实战指南
  • PHP DateTime基础用法
  • 使用 Elasticsearch Dump 工具进行生产环境到测试环境的数据迁移与备份
  • Android blueprint/microfactory/microfactory.bash源码分析
  • C++ -string -常见用法2
  • No.17 笔记 | XXE漏洞:XML外部实体注入攻击
  • 在java中多线程加锁的四种方式
  • 怎么给视频加动态字幕
  • 基于51单片机的大棚环境检测系统设计
  • api返回小数,vue渲染后, 小数点后两位00不显示如,1.00,显示 1
  • 一文详解Ntlm Relay
  • java幂等控制问题
  • docker构建jar镜像
  • 键盘突然用不了,怎么处理
  • Git 汇总