当前位置: 首页 > article >正文

C++面向对象设计模式——单例模式

        关于单例模式,在接触面向对象的设计模式的小伙伴应该不陌生。今天我们来分别介绍一下单例模式中的饿汉模式和懒汉模式。

        先来看一下实现单例模式的原理:
        1、禁止在类外创建类对象,把构造函数、拷贝构造私有化
        2、确保类对象只有一份,在类中定一个静态成员指针变量或类对象
        3、提供一个获取静态类对象、指针的接口,设计静态成员函数用于获取静态类对象、指针

现在来看一下饿汉模式的单例:程序运行时就实例化出类对象,不管后期是否用到都会创建出来

//饿汉模式
#include <iostream>
using namespace std;

class Single
{
    static Single obj;
    Single(void)
    {}
    Single(Single &that)
    {}
public:
    static Single &get_single(void)
    {
        return obj;
    }
};
Single Single::obj;

int main()
{
    Single &s1 = Single::get_single();
    Single &s2 = Single::get_single();
    //Single *s3 = new Single();      // 注意:不能通过new创建单例对象,否则会出现多个实例
    cout<<&s1<<" "<<&s2<<endl;

    return 0;
}

优点:不可能被多个线程同时运行时创建多份    (线程安全)
缺点:如果后期使用不到单例对象,浪费了资源

再来看懒汉模式的单例:  直到真正使用时才创建单例类对象

//懒汉模式
#include <iostream>
#include <pthread.h>
using namespace std;

class Single
{
    static Single *obj;
    Single(void)
    {
        cout<<"构造"<<endl;
    }
    Single(Single &that) {}
public:
    static Single &get_single(void)
    {
        if(NULL==obj)
        {
            obj=new Single;
        }
        return *obj;
    }
};
Single *Single::obj;

void *run(void *arg)
{
    Single &s=Single::get_single();
    return NULL;
}

int main()
{
    Single &s1=Single::get_single();
    Single &s2=Single::get_single();
    cout<<&s1<<" "<<&s2<<endl;

    for(int i=0;i<100;i++)
    {
        pthread_t tid;
        pthread_create(&tid,NULL,run,NULL);
    }

    return 0;
}

优点:什么时候用什么时候创建,如果用不到就不会创建,节约了资源
缺点:可能多个线程同时创建,有可能会创建多份单例对象(线程不安全)(线程竞争问题)

上面是分别用饿汉模式和懒汉模式实现的单例,饿汉模式和懒汉模式各有其优缺点。

关于单例模式的应用场景

        1、任务管理器\日志管理器
        2、网站访问计数器
        3、线程池、内存池
        4、服务器的连接管理器

over


http://www.kler.cn/a/381218.html

相关文章:

  • ES管理工具Cerebro 0.8.5 Windows版本安装及启动
  • ffplay 实现视频流中音频的延迟
  • HTMLCSS:打造酷炫下载安装模拟按钮
  • 青少年编程能力等级测评CPA Python编程(一级)
  • Android App 技能在DuerOS的调试方法
  • 你知道Mac也能拥有丰富的右键菜单栏吗?
  • MATLAB绘制水蒸气温度和压力曲线(IAPWS-IF97公式)
  • git远程和本地创建分支并关联
  • 苍穹外卖WebSocket无法建立连接 (修改前端代码)
  • 鸿蒙HarmonyOS开发生日选择弹框
  • 微信小程序uniapp+vue飞机订票航空售票系统
  • MVC 文件夹结构详解
  • 提升安全上网体验:Windows 11 启用 DOH(阿里公共DNS)
  • 商务礼仪与职场沟通
  • 定义全局键盘监听事件,el-dialog中删除不可用
  • docker离线使用镜像包还原镜像
  • Python设计模式探究:单例模式实现及应用解析
  • C#中的同步和异步回调
  • QML项目实战:自定义Switch按钮
  • 【毫米波雷达(三)】汽车控制器启动流程——BootLoader
  • NewStar easygui re wp
  • 常见用于从 HTTP 请求中提取数据的注解
  • 使用VBA宏合并多个Excel文件的Sheet页
  • 【unique_str 源码学习】
  • 【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器
  • 小菜家教平台:基于SpringBoot+Vue打造一站式学习管理系统