C++单例模式

文章目录


单例模式(Singleton Pattern)是一种常用的设计模式,它确保一个类在程序中只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于管理全局资源(比如配置文件、日志系统、数据库连接等),避免重复创建对象。

C++中实现单例模式的基本步骤

  1. 构造函数私有化:为了防止外部直接创建对象,单例类的构造函数通常被私有化。

  2. 静态成员变量:单例类内部包含一个静态成员变量,用于保存唯一的实例。

  3. 公共静态方法:提供一个公共静态方法,允许外部代码通过它来获取实例。该方法会创建实例(如果没有创建过)并返回。

  4. 防止拷贝:为防止单例对象被复制或赋值,通常需要禁用拷贝构造函数和赋值操作符。

C++代码示例

cpp 复制代码
#include <iostream>

class Singleton {
private:
    // 私有构造函数,防止外部创建实例
    Singleton() {
        std::cout << "Singleton created!" << std::endl;
    }

    // 禁止拷贝构造函数和赋值操作符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public:
    // 静态成员变量,保存唯一实例
    static Singleton* instance;

    // 提供静态方法获取唯一实例
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();  // 延迟实例化
        }
        return instance;
    }

    // 示例方法
    void showMessage() {
        std::cout << "Hello from Singleton!" << std::endl;
    }

    // 静态成员变量初始化
    static void destroyInstance() {
        delete instance;
        instance = nullptr;
    }
};

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

int main() {
    Singleton* singleton1 = Singleton::getInstance();
    singleton1->showMessage();

    Singleton* singleton2 = Singleton::getInstance();
    singleton2->showMessage();

    // 销毁单例实例
    Singleton::destroyInstance();

    return 0;
}

解释:

  • Singleton类的构造函数是私有的,外部不能直接创建实例。
  • instance是一个静态指针,保存唯一的实例。
  • getInstance()方法负责创建实例(如果尚未创建),并返回它。
  • destroyInstance()用于手动销毁单例对象。
  • Singleton(const Singleton&) = delete;operator=(const Singleton&) = delete; 禁止拷贝构造和赋值,确保单例不被复制。

注意事项:

  • 线程安全:如果在多线程环境下使用,可能需要加入线程同步机制(如互斥锁)来确保实例化的唯一性。
  • 延迟初始化:在实例首次被请求时才创建实例(懒汉式)。你也可以使用提前初始化(饿汉式),这会在程序开始时创建实例。
相关推荐
zfoo-framework6 分钟前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
逍遥德26 分钟前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD31 分钟前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_5231853234 分钟前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海35 分钟前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran37 分钟前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黑马师兄1 小时前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记1 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
凡人叶枫2 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯2 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷