设计模式之——单例模式

单例模式的作用

确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式通常用于需要全局访问点的情况,比如日志记录器,配置管理,数据库连接...。可以通过单例模式,可以避免多个实例的创建的占用过多系统资源,同时也可以确保数据的一致性和避免多线程环境下的竞态条件

一.饿汉机制

饿汉模式是一种单例模式的实现,在程序启动时就创建并初始化单例对象,而不是在需要时再进行延迟加载,这样可以确保在程序运行过程中始终只有一个实例对象

#include <iostream>
using namespace std;
class Signal
{
    static Signal obj;  //饿汉机制 !!!很重要   只是声明说明有一个静态成员
    Signal(void )
    {

    }
    //拷贝函数
    Signal( Signal&that )
    {}
public: 
    //获取静态成员
    static Signal& getInstance(void)
    {
        return obj; 
    }
};

Signal Signal::obj;// 在这里创建并初始化单例对象
int main()
{
    Signal &s1=Signal::getInstance();
    Signal &s2=Signal::getInstance();
    cout<<&s1<<" "<<&s2<<endl;
    //Signal s1;   构造函数是私有的  ERROR

}

二.懒汉模式

这个词也很形象,大家可以想象为很懒,实例在调用的时候才开始创建

#include <iostream>
using namespace std;
class Signal
{
    static Signal  * obj;  //懒汉机制
    Signal(void )
    {}
    Signal( Signal& that )
    {}
public: 
    static Signal& getInstance(void)
    {
        if(NULL==obj)
        {
            //创建了一个实例
            obj=new Signal; //加锁改进     
        }
        return *obj; 
    }

};

Signal *Signal::obj;//声明了一个指针变量
int main()
{
    Signal &s1=Signal::getInstance();
    Signal &s2=Signal::getInstance();
    cout<<&s1<<" "<<&s2<<endl;  //共用同一块地址
   // Signal s1; //  构造函数是私有的  ERROR
}

懒汉改进:多线程

#include <iostream>
#include <pthread.h>
using namespace std;
class Signal
{
    static Signal  * obj;  //懒汉机制
    Signal(void )
    {
        cout<<"构造"<<endl;
    }
    Signal( Signal& that )
    {}
public: 
    static Signal& getInstance(void)
    {
        if(NULL==obj)
        {
            obj=new Signal; //加锁改进
        }
        return *obj; 
    }

};
Signal *Signal::obj;
void *run(void *arg)
{
    Signal &s=Signal::getInstance();
    return NULL;
}

int main()
{
//     Signal &s1=Signal::getInstance();
//     Signal &s2=Signal::getInstance();
//     cout<<&s1<<" "<<&s2<<endl;  //共用同一块地址
//    // Signal s1; //  构造函数是私有的  ERROR
    for(int i=0;i<100;i++)
    {
        pthread_t tid;
        pthread_create(&tid,NULL,run,NULL);
    }
    return 0;
}
相关推荐
做人不要太理性20 分钟前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
程序员-King.29 分钟前
2、桥接模式
c++·桥接模式
chnming198733 分钟前
STL关联式容器之map
开发语言·c++
程序伍六七1 小时前
day16
开发语言·c++
小陈phd1 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
火山口车神丶1 小时前
某车企ASW面试笔试题
c++·matlab
是阿建吖!2 小时前
【优选算法】二分查找
c++·算法
Ajiang28247353044 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
哪 吒7 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10227 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee