设计模式——单例模式(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;
}
相关推荐
Yeniden7 小时前
【设计模式】享元模式(Flyweight)大白话讲解!
java·设计模式·享元模式
豐儀麟阁贵8 小时前
5.6对象
java·开发语言
格格步入8 小时前
🤔一次 OOM 排查(dump文件分析)
java·后端
蓝-萧8 小时前
Spring Security安全框架原理与实战
java·后端
Moe4888 小时前
CompletableFuture方法大全和使用详解(一步到位)
java·性能优化
嵌入式小李.man8 小时前
linux中多路复用IO:select、poll和epoll
linux·c++
郝学胜-神的一滴8 小时前
QAxios研发笔记(二):在Qt环境下基于Promise风格简化Http的Post请求
开发语言·c++·笔记·qt·网络协议·程序人生·http
敲代码的嘎仔8 小时前
数据结构算法学习day3——二分查找
java·开发语言·数据结构·学习·程序人生·算法·职场和发展
代码不停8 小时前
JavaEE多线程进阶
java·数据结构·java-ee