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

设计模式——单例模式(singleton)

文章目录

  • 引言
  • 单例代码实现
    • 单类简易版
    • 模板通用版

引言

相信大家对单例模式都不陌生,本博客主要结合C++17写一个相对标准的单例模式框架,并进行讲解。

这也是创建型模式的最后一篇,大家感兴趣的可以看看其余4个创建型模式:

  1. 抽象工厂
  2. 生成器模式
  3. 工厂方法
  4. 原型模式

单例代码实现

单类简易版

class Singleton {
public:// 获取唯一实例的全局访问点(懒加载 + 线程安全)static Singleton& instance() noexcept {static Singleton instance; // C++11 起保证线程安全return instance;}// 禁止拷贝和移动Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;Singleton(Singleton&&) = delete;Singleton& operator=(Singleton&&) = delete;// 提供示例方法void doSomething() {std::cout << "Singleton working at " << this << std::endl;}private:// 构造函数设为私有,防止外部创建Singleton() {std::cout << "Singleton constructed.\n";}~Singleton() {std::cout << "Singleton destroyed.\n";}
};// 测试
int main() {Singleton::instance().doSomething();Singleton::instance().doSomething();
}

模板通用版

// === 通用单例模板 ===
template <typename T>
class Singleton {
public:static T& instance() {static T instance; // C++11+ 确保线程安全return instance;}protected:Singleton() = default;~Singleton() = default;Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};// === 具体的单例类 ===
class Logger : public Singleton<Logger> {friend class Singleton<Logger>;  // 允许 Singleton 访问私有构造private:Logger() = default;              // 外部无法 new Logger()~Logger() = default;public:void log(const std::string& message) {std::cout << "[LOG] " << message << std::endl;}
};// === 使用示例 ===
int main() {// 获取 Logger 的唯一实例auto& logger = Logger::instance();// 使用单例对象logger.log("System initialized.");logger.log("User logged in.");// 再次获取 instance,返回同一个对象auto& logger2 = Logger::instance();logger2.log("Still the same instance!");// 验证地址一致std::cout << "logger addr: " << &logger << std::endl;std::cout << "logger2 addr: " << &logger2 << std::endl;return 0;
}
http://www.dtcms.com/a/561246.html

相关文章:

  • 【计算机软件资格考试】软考综合知识题高频考题及答案解析1
  • 计算机网络自顶向下方法25——运输层 TCP流量控制 连接管理 “四次挥手”的优化
  • LeetCode【高频SQL基础50题】
  • 清远做网站的有哪些wordpress判断浏览器
  • 自己做的网站怎样才有网址浏览找人做网站域名怎么过户
  • JavaScript中的闭包:原理与实战
  • 怎么看一个网站是否被k怎么找项目
  • 交易网站开发做的比较好的p2p网站
  • JavaScript异步编程:从回调地狱到优雅解决方案
  • 【MATLAB】matlab闪退问题(随时更新)
  • 有专门做最佳推荐的网站东莞网站制作十年乐云seo
  • React中的stopPropagation和preventDefault
  • React Hooks:提升前端开发效率的关键
  • Apache Tomcat 介绍
  • 国网公司网站建设宠物网站的目的
  • 怎么找做网站的外包公司二级域名是什么
  • CentOS 7/8/9 一键安装 Python 3.10+ 并配置默认版本
  • Harmony鸿蒙开发0基础入门到精通Day08--JavaScript篇
  • OpenCV(十八):绘制文本
  • Arbess实践指南(3) - 使用Arbess+sourcefare+PostIn实现Java项目自动化部署 + 代码扫描 + 接口自动化测试
  • 一,PCB介绍
  • 重庆网站建设机构科技进步是国防强大的重要的保证
  • asp网站用什么数据库做网站怎么导入源码
  • 【Docker】容器操作和实战
  • 阿里巴巴网站如何做免费推广wordpress首页文章轮播
  • 缓存三大问题及解决方案
  • 深度学习周报(10.27~11.2)
  • 怎么做便民信息网站原创小说手机网站制作需要多少钱
  • Java外功精要——Spring AOP
  • 线程从共享队列取任务的底层机制