设计模式——单例模式(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;
}
相关推荐
小羊没烦恼!14 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
倒头就睡的小比特14 小时前
算法竞赛C++常用的STL
c++·算法
weilx123414 小时前
C++笔记-文件IO-<fcntl.h>
c++
俊昭喜喜里14 小时前
java中的继承和多态的区别
java
小羊没烦恼!14 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕15 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码15 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖15 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时15 小时前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang16 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot