C++设计模式之单例模式

设计模式

单例模式

单例模式(Singleton Pattern)设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。

一般分为懒汉式单例模式 和饿汉式单例模式

特点

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

使用场景

  1. Windows任务管理器,全局只有一个
  2. 打印机的后台处理服务
  3. 数据库的连接池

优点

  1. 内存中只有一个实例,减少内存开销,尤其是频繁创建和销毁实例时.
  2. 避免资源的多重占用(如写文件操作)。

缺点

  1. 没有接口,不能继承。
  2. 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心实例化方式。

懒汉式单例模式

复制代码
懒汉式单例模式是指在需要的时候才去创建实例对象。

代码:

cpp 复制代码
class Singleton {
private:
    static Singleton* instance;
    
    // 私有构造函数,防止外部调用构造新的实例,拷贝构造函数也一样
    Singleton() {}
    
public:
    // 获取单例实例的静态方法
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
    
    // 示例方法
    void printMessage() {
        std::cout << "Hello, I am a singleton instance!" << std::endl;
    }
};

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

int main() {
    // 获取单例实例并调用方法
    Singleton* singleton = Singleton::getInstance();
    singleton->printMessage();
    
    return 0;
}

解释:

  • Singleton 类中的静态成员变量 instance 用于保存唯一的实例对象,初始值为 nullptr。
  • getInstance() 方法是获取单例对象的唯一入口,首次调用时会创建 Singleton 类的实例并返回,后续调用则直接返回已经创建的实例。
  • 构造函数 Singleton() 被声明为私有,这样外部无法通过构造函数来创建新的实例,确保单例的唯一性。

特点

  • 懒汉式单例模式的优点是只有在需要时才会创建实例,节省了资源。
  • 缺点是在多线程环境下,可能会出现竞态条件,需要考虑线程安全性,可以通过加锁等方式解决。

饿汉式单例模式

复制代码
饿汉式单例模式是指在类加载时就创建实例对象。

代码

cpp 复制代码
class Singleton {
private:
    static Singleton* instance;
    
    // 私有构造函数,防止外部调用构造新的实例
    Singleton() {}
    
public:
    // 获取单例实例的静态方法
    static Singleton* getInstance() {
        return instance;
    }
    
    // 示例方法
    void printMessage() {
        std::cout << "Hello, I am a singleton instance!" << std::endl;
    }
};

// 初始化静态成员变量,在类加载时即创建实例
Singleton* Singleton::instance = new Singleton();

int main() {
    // 获取单例实例并调用方法
    Singleton* singleton = Singleton::getInstance();
    singleton->printMessage();
    
    return 0;
}

解释

  • 饿汉式单例模式中,静态成员变量 instance 在类加载时就会被初始化,因此实例在程序运行期间一直存在。
  • getInstance() 方法直接返回预先创建好的实例,无需进行额外的判断和创建。

特点

  • 饿汉式单例模式的优点是实现简单,线程安全(因为实例在类加载时就创建,不存在竞态条件)。
  • 缺点是可能会占用更多的系统资源,因为实例在程序启动时就被创建出来。

如何选择

  • 如果程序中对单例对象的使用频率较低,或者希望延迟加载以节省资源,可以选择懒汉式单例模式。
  • 如果程序中对单例对象的使用频率较高,且希望在使用时能够立即获得实例,可以选择饿汉式单例模式。

根据具体的需求和应用场景选择合适的单例模式实现方式。

相关推荐
码客-ygluu7 小时前
X3 LUA 异步分布式微服务集群框架
c++·架构·lua
九英里路10 小时前
protobuf快速上手
网络·c++·中间件·json·谷歌·序列化·protobuf
纪念 22910 小时前
C++ 算法基础 (差分)
开发语言·c++·算法
用户6242931966213 小时前
告别 Electron 臃肿与 Wireshark 老化界面:用 Rust + Tauri 2.0 构建多总线网络与现场总线深度分析仪 Omni-Probe
设计模式
是2的10次方啊15 小时前
设计模式与生活㉒:暖气热不热,得一间一间摸过去
设计模式
ShineWinsu15 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽16 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
bigbread20 小时前
迭代器模式-在区域健康档案导出中的实战应用
设计模式
汉克老师21 小时前
《从C++小白到算法高手:GESP 1—8级成长地图》第一讲:认识GESP——从编程新手到算法探索者
c++·gesp·信息学竞赛·小学生学c++
装不满的克莱因瓶1 天前
设计模式之策略模式核心概念和应用场景
java·后端·设计模式·架构·系统架构·策略模式