设计模式之单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。它通常用于管理共享资源或配置,如日志记录、数据库连接等。

1. 主要特征

  • 唯一性:确保类只有一个实例。
  • 全局访问:提供一个静态方法来获取该实例。
  • 延迟初始化:实例可以在需要时创建,而不是在程序启动时。

2. 实现方式

以下是单例模式的常见实现方式:

1. 饿汉式

在类加载时就创建实例,简单但可能导致资源浪费。

cpp 复制代码
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // 静态实例
        return instance;
    }

private:
    Singleton() {} // 私有构造函数
    Singleton(const Singleton&) = delete; // 禁止拷贝构造
    Singleton& operator=(const Singleton&) = delete; // 禁止赋值
};

2. 懒汉式

在首次调用时创建实例,适合资源开销较大的情况。

cpp 复制代码
#include <mutex>

class Singleton {
public:
    static Singleton& getInstance() {
        std::call_once(initInstanceFlag, &Singleton::initInstance);
        return *instance;
    }

private:
    Singleton() {} // 私有构造函数
    ~Singleton() {}

    static void initInstance() {
        instance = new Singleton();
    }

    static Singleton* instance;
    static std::once_flag initInstanceFlag;

    Singleton(const Singleton&) = delete; // 禁止拷贝构造
    Singleton& operator=(const Singleton&) = delete; // 禁止赋值
};

// 静态成员初始化
Singleton* Singleton::instance = nullptr;

3. 优点

  • 全局访问:提供了一个全局访问点,方便使用。
  • 节省资源:可以控制实例的创建,避免资源浪费。

4. 缺点

  • 难以测试:单例模式可能导致代码难以测试,特别是当依赖于单例的类不易于模拟时。
  • 隐藏依赖:使用单例可能导致隐含的依赖关系,降低代码的清晰度。
  • 线程安全问题:在多线程环境中实现单例时需要特别注意,可能需要额外的同步机制。

5. 使用场景

  • 配置管理:应用程序的全局配置。
  • 日志记录:全局的日志管理。
  • 数据库连接:确保数据库连接的唯一性和共享。

总结

单例模式是一种简单而有效的设计模式,适用于需要确保类仅有一个实例的场景。然而,在使用时应考虑其可能带来的复杂性和测试难度,合理应用以获得最佳效果。

相关推荐
ttod_qzstudio1 小时前
【软考设计模式】中介者模式:网状交互的解耦与集中调度精讲
设计模式·中介者模式
饼干哥哥1 天前
一夜之间,全世界的 Agent 能力提高了一个档次
设计模式·agent·代码规范
Kel1 天前
管道、IPC、Socket:你以为的三种技术,其实是同一件事
javascript·设计模式·node.js
我登哥MVP1 天前
进 Gang of Four 设计模式:建造者模式
java·设计模式·建造者模式
进击的前栈2 天前
鸿蒙实战:19 页面全景汇总与 7 大共享设计模式回顾
华为·设计模式·harmonyos
刀法如飞2 天前
Spring Boot 4.1 + JDK 25 DDD开源脚手架,面向 AI 编程
设计模式·架构·ai编程
折哥的程序人生 · 物流技术专研2 天前
第8篇:模板方法模式的优缺点与面试高频考点
java·设计模式·面试·模板方法模式·行为型模式·优缺点·扩充系列
workflower2 天前
人形机器人全身运动控制能力大幅提升
人工智能·深度学习·机器学习·设计模式·机器人·自动化
折哥的程序人生 · 物流技术专研2 天前
Java 23 种设计模式:从踩坑到精通 | 备忘录模式 —— 快照与撤销,给对象装一个“后悔药”
java·设计模式·备忘录模式·行为型模式·java设计模式·从踩坑到精通·撤销重做
Kel2 天前
万物皆 Runnable:LangChain 如何用一个接口统一模型、链与图
人工智能·设计模式·架构