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

文章目录

引言

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

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

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

单例代码实现

单类简易版

cpp 复制代码
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();
}

模板通用版

cpp 复制代码
// === 通用单例模板 ===
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;
}
相关推荐
老蒋每日coding7 分钟前
多智能体系统工作流的设计模式与实现策略
设计模式
从此不归路15 分钟前
Qt5 进阶【13】桌面 Qt 项目架构设计:从 MVC/MVVM 到模块划分
开发语言·c++·qt·架构·mvc
undsky_18 分钟前
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
java·人工智能·spring boot·ai·ai编程
历程里程碑21 分钟前
Linux15 进程二
linux·运维·服务器·开发语言·数据结构·c++·笔记
不光头强23 分钟前
shiro学习要点
java·学习·spring
HAPPY酷24 分钟前
构建即自由:一份为创造者设计的 Windows C++ 自动化构建指南
开发语言·c++·ide·windows·python·策略模式·visual studio
工一木子25 分钟前
Java 的前世今生:从 Oak 到现代企业级语言
java·开发语言
xiaoye-duck26 分钟前
C++ string 底层原理深度解析 + 模拟实现(上)——面试 / 开发都适用
c++·面试·stl
啟明起鸣27 分钟前
【C++20新特性】概念约束特性与 “模板线程池”,概念约束是为了 “把握未知对象”
开发语言·c++·c++20·模板线程池
H Journey30 分钟前
Linux su 命令核心用法总结
java·linux·服务器·su