首页 > 后端开发 > C++ > 正文

c++如何实现单例模式_c++设计模式之单例模式实现方法

裘德小鎮的故事
发布: 2025-09-23 09:40:01
原创
595人浏览过
单例模式通过私有构造函数和静态成员确保类唯一实例,C++中常用Meyers' Singleton(线程安全、简洁)或双重检查锁(延迟加载、高效)实现,前者推荐优先使用。

c++如何实现单例模式_c++设计模式之单例模式实现方法

单例模式确保一个类只有一个实例,并提供一个全局访问点。实现的关键在于控制实例的创建,通常通过私有化构造函数和静态成员变量来实现。

解决方案:

C++中实现单例模式有多种方法,以下提供几种常见的实现方式:

1. 懒汉式(线程不安全)

立即学习C++免费学习笔记(深入)”;

class Singleton {
private:
    Singleton() {} // 私有构造函数
    static Singleton* instance;

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr; // 静态成员变量初始化
登录后复制

这种方式在第一次调用

getInstance()
登录后复制
时才创建实例。 但线程不安全,多个线程可能同时进入
if (instance == nullptr)
登录后复制
,导致创建多个实例。

2. 懒汉式(线程安全,但效率较低)

#include <mutex>

class Singleton {
private:
    Singleton() {}
    static Singleton* instance;
    static std::mutex mutex;

public:
    static Singleton* getInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
登录后复制

使用

std::mutex
登录后复制
保证线程安全,但每次调用
getInstance()
登录后复制
都需要加锁,效率较低。

3. 饿汉式(线程安全)

class Singleton {
private:
    Singleton() {}
    static Singleton* instance;

public:
    static Singleton* getInstance() {
        return instance;
    }
};

Singleton* Singleton::instance = new Singleton(); // 在程序启动时创建实例
登录后复制

在程序启动时就创建实例,线程安全,但可能造成资源浪费,如果实例一直没有被使用。

4. Double-Checked Locking(双重检查锁,C++11 之后推荐)

#include <mutex>
#include <atomic>

class Singleton {
private:
    Singleton() {}
    static std::atomic<Singleton*> instance;
    static std::mutex mutex;

public:
    static Singleton* getInstance() {
        Singleton* tmp = instance.load(std::memory_order_relaxed);
        if (tmp == nullptr) {
            std::lock_guard<std::mutex> lock(mutex);
            tmp = instance.load(std::memory_order_relaxed);
            if (tmp == nullptr) {
                tmp = new Singleton();
                instance.store(tmp, std::memory_order_release);
            }
        }
        return tmp;
    }
};

std::atomic<Singleton*> Singleton::instance;
std::mutex Singleton::mutex;
登录后复制

这种方式结合了懒汉式和线程安全,只有在实例未创建时才加锁。使用

std::atomic
登录后复制
保证原子性,
std::memory_order_relaxed
登录后复制
std::memory_order_release
登录后复制
用于控制内存访问顺序,避免指令重排导致的问题。 C++11之后,这种方式相对较好。

设计师AI工具箱
设计师AI工具箱

最懂设计师的效率提升平台,实现高效设计出图和智能改图,室内设计,毛坯渲染,旧房改造 ,软装设计

设计师AI工具箱 124
查看详情 设计师AI工具箱

5. Meyers' Singleton (C++11 推荐)

class Singleton {
private:
    Singleton() {}
    Singleton(const Singleton&);             // Deleted.
    Singleton& operator=(const Singleton&);  // Deleted.

public:
    static Singleton& getInstance() {
        static Singleton instance; // 局部静态变量,C++11保证线程安全
        return instance;
    }
};
登录后复制

利用C++11标准中局部静态变量的线程安全特性,这是最简洁、最推荐的单例模式实现方式。 避免了手动管理锁,代码简洁,易于理解。

单例模式在多线程环境下如何保证线程安全?

上述代码示例中,提供了多种保证线程安全的方式。 核心思路是使用互斥锁(

std::mutex
登录后复制
)或原子操作(
std::atomic
登录后复制
)来防止多个线程同时创建实例。 双重检查锁和 Meyers' Singleton 是比较推荐的方式,前者在需要延迟加载时使用,后者简洁高效。

单例模式有哪些优缺点?

优点:

  • 全局唯一访问点: 方便访问,无需频繁创建和销毁对象。
  • 节省资源: 只有一个实例,减少内存占用
  • 方便控制: 可以集中控制实例的创建和销毁。

缺点:

  • 违反单一职责原则: 单例类既负责自己的业务逻辑,又负责管理自己的实例。
  • 难以测试: 单例类的依赖关系难以模拟,影响单元测试。
  • 可能导致全局状态: 单例类的状态可能被多个模块共享,导致难以追踪和调试。
  • 不易扩展: 单例类难以扩展,如果需要多个实例,需要修改代码。

如何选择合适的单例模式实现方式?

选择单例模式的实现方式需要考虑以下因素:

  • 线程安全: 如果在多线程环境下使用,必须保证线程安全。
  • 延迟加载: 如果希望在第一次使用时才创建实例,可以使用懒汉式或双重检查锁。
  • 性能: 如果对性能要求较高,可以使用饿汉式或 Meyers' Singleton。
  • 代码简洁性: Meyers' Singleton 是最简洁的实现方式。

通常情况下,推荐使用 Meyers' Singleton,除非有特殊需求(例如延迟加载),才考虑其他实现方式。

以上就是c++++如何实现单例模式_c++设计模式之单例模式实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号