首页 > 其他分享 >设计模式--单例模式

设计模式--单例模式

时间:2024-03-13 12:11:06浏览次数:25  
标签:std Singleton getInstance -- instance mutex 单例 设计模式

单例模式的3种实现方式:

  • 饿汉式、
  • 懒汉式
  • 双重检查

1. 饿汉式(Eager Initialization)

饿汉式单例模式在类加载时就创建实例,因此线程安全,但可能会增加程序启动时间和内存消耗。

#include <iostream>

class Singleton {
public:
    // 获取单例对象的静态方法
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }

    // 删除拷贝构造函数和赋值运算符重载,确保只能通过 getInstance 获取单例
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    // 私有构造函数,防止外部实例化
    Singleton() {}
};

int main() {
    Singleton& s1 = Singleton::getInstance();
    Singleton& s2 = Singleton::getInstance();

    // s1 和 s2 是同一个实例
    std::cout << (&s1 == &s2) << std::endl; // 输出 1

    return 0;
}

在这个示例中,静态局部变量 instance 在程序启动时就会初始化,因此可以保证线程安全性,但可能会增加程序启动时间和内存消耗。

 

2. 懒汉式(Lazy Initialization)

懒汉式单例模式在第一次使用时才会创建实例,避免了启动时间和内存消耗,但需要考虑线程安全问题。

#include <iostream>
#include <mutex>

class Singleton {
public:
    // 获取单例对象的静态方法
    static Singleton& getInstance() {
        std::lock_guard<std::mutex> lock(mutex);
        if (!instance)
            instance = new Singleton();
        return *instance;
    }

    // 删除拷贝构造函数和赋值运算符重载,确保只能通过 getInstance 获取单例
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    // 私有构造函数,防止外部实例化
    Singleton() {}

    // 静态成员变量和互斥量
    static Singleton* instance;
    static std::mutex mutex;
};

// 静态成员变量的定义
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;

int main() {
    Singleton& s1 = Singleton::getInstance();
    Singleton& s2 = Singleton::getInstance();

    // s1 和 s2 是同一个实例
    std::cout << (&s1 == &s2) << std::endl; // 输出 1

    return 0;
}

在这个示例中,getInstance() 方法会在第一次调用时创建实例,使用了双重检查锁定的方式来确保线程安全性。

 

3. 双重检查锁定(Double-Checked Locking)

双重检查锁定是对懒汉式的改进,避免了每次调用都需要加锁的性能损耗。

#include <iostream>
#include <mutex>

class Singleton {
public:
    // 获取单例对象的静态方法
    static Singleton& getInstance() {
        if (!instance) {
            std::lock_guard<std::mutex> lock(mutex);
            if (!instance)
                instance = new Singleton();
        }
        return *instance;
    }

    // 删除拷贝构造函数和赋值运算符重载,确保只能通过 getInstance 获取单例
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    // 私有构造函数,防止外部实例化
    Singleton() {}

    // 静态成员变量和互斥量
    static Singleton* instance;
    static std::mutex mutex;
};

// 静态成员变量的定义
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex;

int main() {
    Singleton& s1 = Singleton::getInstance();
    Singleton& s2 = Singleton::getInstance();

    // s1 和 s2 是同一个实例
    std::cout << (&s1 == &s2) << std::endl; // 输出 1

    return 0;
}

在这个示例中,双重检查锁定的方式可以减少每次调用 getInstance() 方法时加锁的开销,提高性能。

 

-- - - - > > >  更多设计模式的内容,请看这里

标签:std,Singleton,getInstance,--,instance,mutex,单例,设计模式
From: https://www.cnblogs.com/music-liang/p/18070341

相关文章

  • C++指针(五)完结篇
    个人主页:PingdiGuo_guo收录专栏:C++干货专栏前言相关文章:C++指针(一)、C++指针(二)、C++指针(三)、C++指针(四)万字图文详解!本篇博客是介绍const、野指针、双指针、assert断言、NULL指针的知识的。文章目录前言1.const与指针1.1修饰变量1.2修饰指针变量2.野指针2.1为......
  • 美易官方:英国央行官员Mann称投资表现不佳令人担忧
    英国央行官员Mann对于投资表现不佳的担忧,凸显了全球经济环境的不确定性和复杂性。作为英国央行的重要决策者之一,Mann对投资市场的观察和分析具有深远的影响。他的担忧不仅反映了当前的经济状况,也预示着未来可能面临的挑战。首先,投资表现不佳可能意味着经济增长的放缓或停滞。......
  • 实验案例:使用Windows 10桌面系统
    1、实验环境      BDON公司刚刚招聘了一位新入职员工小张。部门经理要求系统管理员带小张快速地熟悉公司环境以尽快上手工作,系统管理员为小张的计算机安装了Windows1o操作系统以后,需要小张进一步熟悉公司的Windows10桌面环境及使用系统的基本操作,以便更好地实......
  • 开题顺序(暴搜&dfs)---牛客小白月赛69-C
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'#defineinf0x3f3f3f3fconstintN=2e5+5;intn,t,p;inta[N],b[N],c[N],x[N],y[N];intres,vis[N];voiddfs(ints,intm){ res=max(res,s); for(inti=1;i......
  • Cesium 地图视角定位到某一个范围
    问题:Cesium地图视角定位到某一个范围解决过程:1.在Cesium地图上定位到某一个范围,地图的视角转为该范围2.需要的数据是要定位的范围所对应的经纬度和高度3.Cesium.Cartesian3.fromDegrees()方法是从以度为单位的经度和纬度值返回Cartesian3位置,也就是正常经纬度转为世界坐标(......
  • springboot基于JavaWeb的兽医站管理系统的设计与实现
    摘要随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的兽医站管理系统。当前的信息管理存在工作效率低,工作繁杂等问题,基于信息化的兽医站管理目......
  • springboot基于Java的公共交通查询系统的设计与实现
    摘要近年来互联网络的迅猛发展和电子终端设备的普及,赋予了各行业充足的发展空间。公共交通查询系统相比于传统信息技术,时效性是它最大的特色,已经在电子娱乐、经济等中发挥着举足轻重的作用。2019年疫情的爆发,更是短时间内迅速扩大了线上管理系统的规模。尽管服务行业已经......
  • 开关电源的各功能电路(建议收藏)
    1、开关电源的电路组成开关电源的主要电路是由输入电磁干扰滤波器(EMI)、整流滤波电路、功率变换电路、PWM控制器电路、输出整流滤波电路组成。辅助电路有输入过欠压保护电路、输出过欠压保护电路、输出过流保护电路、输出短路保护电路等。开关电源的电路组成方框图如下:2......
  • springboot基于Java的远程就医系统
    摘要随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了远程就医的发展。然而,由于用户量和需求量的增加,信息过载等......
  • 使用kubeadm部署Kubernetes 1.26及其它版本
    1.系统配置环境信息:系统:CentOSLinuxrelease7.6.1810(Core)k8s版本:1.26.0(可自己选择)IP主机名规划角色192.168.223.123auto-inspaction-1master192.168.223.68auto-inspaction-0node192.168.223.73auto-inspaction-2node在各个主机上完成下......