设计模式——单例模式(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;
}
相关推荐
草原上唱山歌3 分钟前
推荐学习的C++书籍
开发语言·c++·学习
牛奔11 分钟前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
工具罗某人11 分钟前
docker快速部署jenkins
java·docker·jenkins
sxlishaobin23 分钟前
设计模式之原型模式
设计模式·原型模式
华如锦34 分钟前
四:从零搭建一个RAG
java·开发语言·人工智能·python·机器学习·spring cloud·计算机视觉
Tony_yitao36 分钟前
22.华为OD机试真题:数组拼接(Java实现,100分通关)
java·算法·华为od·algorithm
JavaGuru_LiuYu37 分钟前
Spring Boot 整合 SSE(Server-Sent Events)
java·spring boot·后端·sse
2501_9418752839 分钟前
在东京复杂分布式系统中构建统一可观测性平台的工程设计实践与演进经验总结
c++·算法·github
爬山算法41 分钟前
Hibernate(26)什么是Hibernate的透明持久化?
java·后端·hibernate
彭于晏Yan43 分钟前
Springboot实现数据脱敏
java·spring boot·后端