C++ 单例设计模式详解
一、概述
单例设计模式是一种常用的软件设计模式,该模式的主要目标是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
二、应用场景
1. 创建一个对象需要消耗的资源过多,例如读取配置、建立数据库连接等。
2. 系统中只需要一个实例对象,如系统级别的对象。
3. 需要频繁创建和销毁的对象,单例模式提供了一种减少系统性能开销的方法。
三、实现方式
在C++中,实现单例设计模式的方式有很多,下面介绍三种常见的方式。
1. 懒汉式-线程安全
class Singleton {
public:
    static Singleton* getInstance() {
        if (instance == nullptr) { // double check
            std::lock_guard<std::mutex> lock(mutex);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
private:
    Singleton() {} // 私有构造函数,防止外部创建实例
    static Singleton* instance;
    static std::mutex mutex;
};
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;
这种方式使用了双检锁/双重校验锁(DCL,即double-checked locking)来确保线程安全和延迟初始化。
2. 饿汉式-线程安全
class Singleton {
public:
    static Singleton& getInstance() {
        return instance;
    }
private:
    Singleton() {} // 私有构造函数,防止外部创建实例
    static Singleton instance; // 已经完全构造好的实例,被首次访问时初始化
};
Singleton Singleton::instance; // 初始化为 INITIALIZER 阶段,不是 CONSTRUCTOR 阶段
这种方式在类被加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。由于实
例已经创建,所以不存在多线程问题。
单例模式的几种实现方式
3. 静态局部变量
class Singleton {
public:
    static Singleton& getInstance() {
        return instance;
    }
private:
    Singleton() {} // 私有构造函数,防止外部创建实例
    static Singleton instance; // 完全等同于上面的饿汉式实现方式
};  // C++ 保证全局 / 静态对象的初始化是线程安全的:它们在 main() 函数开始运行前就已经被初始化了。
Singleton Singleton::instance; // 初始化完毕
这种方式和饿汉式一样,在类被加载时就完成了初始化。它的优点和缺点和饿汉式相同。
四、使用注意点
1. 违反了开放封闭原则:由于单例模式的代码修改会影响到系统的其他部分,因此不易于对系统进行扩展与维护。同时,如果需要修改单例类的行为,可能需要创建一个新的子类并重写相应的方法。
2. 在某些情况下可能无法使用:某些语言或框架可能不支持单例模式,或者实现起来比较困难。在这种情况下,可以考虑使用其他设计模式来解决问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。