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

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

先来看一下实现单例模式的原理:

1、禁止在类外创建类对象,把构造函数、拷贝构造私有化

2、确保类对象只有一份,在类中定一个静态成员指针变量或类对象

3、提供一个获取静态类对象、指针的接口,设计静态成员函数用于获取静态类对象、指针

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

cpp 复制代码
//饿汉模式
#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;
}

优点:不可能被多个线程同时运行时创建多份 (线程安全)

缺点:如果后期使用不到单例对象,浪费了资源

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

cpp 复制代码
//懒汉模式
#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

相关推荐
小成202303202652 分钟前
C++~02运算符重载
开发语言·c++
geovindu25 分钟前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
郑同学的笔记1 小时前
【c++随笔30】C++ 注册回调函数
开发语言·c++
lengxuenong1 小时前
树状数组 · 信息学学习手册2-离散化与逆序对
c++·学习·算法
十二1 小时前
【洛谷题解】P1115 最大子段和(前缀和 + 维护最小前缀)
数据结构·c++·算法·蓝桥杯
SENKS_DIGITAL3 小时前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
cu1433 小时前
细谈IT65631的具体功能与其应用
c++·单片机·嵌入式硬件
幻智星科技3 小时前
Karatsuba与CSD优化FPGA大数乘法
c++·fpga开发·密码学
flower9803234 小时前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
lengxuenong4 小时前
树状数组 · 信息学学习手册3-优化LIS
c++·学习·算法