单例模式(C++)

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这有助于控制资源的共享,以及限制对特定资源的访问权限。在单例模式中,通常通过私有构造函数和静态方法来实现。

懒汉式(Lazy Initialization):

懒汉式是指在第一次请求实例时才创建实例。这种方式避免了在程序启动时就创建对象,延迟了对象的实例化时间。

C++懒汉式单例模式示例:
cpp 复制代码
#include <iostream>

class SingletonLazy {
private:
    static SingletonLazy *instance;
    
    // 私有构造函数,防止外部直接实例化
    SingletonLazy() {}
    
public:
    // 获取实例的静态方法
    static SingletonLazy *getInstance() {
        if (instance == nullptr) {
            instance = new SingletonLazy();
        }
        return instance;
    }
    
    // 其他成员方法
    void showMessage() {
        std::cout << "Hello from SingletonLazy!" << std::endl;
    }
};

// 在程序开始时,静态成员需要在类外初始化
SingletonLazy *SingletonLazy::instance = nullptr;

int main() {
    SingletonLazy *lazyInstance1 = SingletonLazy::getInstance();
    lazyInstance1->showMessage();

    SingletonLazy *lazyInstance2 = SingletonLazy::getInstance();
    
    // 判断是否是同一个实例
    if (lazyInstance1 == lazyInstance2) {
        std::cout << "Both instances are the same." << std::endl;
    } else {
        std::cout << "Instances are different." << std::endl;
    }

    return 0;
}

饿汉式(Eager Initialization):

饿汉式是指在类加载的时候就创建实例,因此无论是否需要都会创建一个实例。这种方式在多线程环境下需要小心,可能会导致资源浪费。

C++饿汉式单例模式示例:
cpp 复制代码
#include <iostream>

class SingletonEager {
private:
    // 在类加载时就创建实例
    static SingletonEager *instance;

    // 私有构造函数,防止外部直接实例化
    SingletonEager() {}

public:
    // 获取实例的静态方法
    static SingletonEager *getInstance() {
        return instance;
    }

    // 其他成员方法
    void showMessage() {
        std::cout << "Hello from SingletonEager!" << std::endl;
    }
};

// 在程序开始时,静态成员需要在类外初始化
SingletonEager *SingletonEager::instance = new SingletonEager();

int main() {
    SingletonEager *eagerInstance1 = SingletonEager::getInstance();
    eagerInstance1->showMessage();

    SingletonEager *eagerInstance2 = SingletonEager::getInstance();
    
    // 判断是否是同一个实例
    if (eagerInstance1 == eagerInstance2) {
        std::cout << "Both instances are the same." << std::endl;
    } else {
        std::cout << "Instances are different." << std::endl;
    }

    return 0;
}

区别:

  1. 初始化时机:

    • 懒汉式: 实例在第一次被请求时才创建。
    • 饿汉式: 实例在类加载时就创建。
  2. 线程安全性:

    • 懒汉式: 需要在多线程环境中使用额外的同步机制,以确保只有一个实例被创建。
    • 饿汉式: 在多线程环境中,由于实例在类加载时就创建,因此不需要额外的同步机制。
  3. 资源浪费:

    • 懒汉式: 避免了在程序启动时就创建实例,可能会在实际需要时再进行实例化,减少了资源浪费。
    • 饿汉式: 在程序启动时就创建实例,可能会造成不必要的资源浪费,尤其在实例很大或者实例化代价较高时。

选择懒汉式还是饿汉式取决于具体的需求和性能要求。如果资源消耗不是问题且希望避免潜在的线程安全问题,饿汉式可能是一个不错的选择。如果希望延迟实例化并避免不必要的资源浪费,懒汉式可能更合适。

相关推荐
故事和你918 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__8 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__8 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
一 乐9 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
恼书:-(空寄9 小时前
JVM GC 日志分析 + 常见 GC 场景 + 实战参数调优
java·jvm
消失的旧时光-19439 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
leaves falling10 小时前
C++模板进阶
开发语言·c++
无敌昊哥战神10 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode