设计模式之——单例模式

单例模式的作用

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

一.饿汉机制

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

复制代码
#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;
}
相关推荐
姓刘的哦21 分钟前
Qt中的QWebEngineView
数据库·c++·qt
C_player_00123 分钟前
——贪心算法——
c++·算法·贪心算法
SundayBear1 小时前
QT零基础入门教程
c++·qt
kyle~2 小时前
排序---插入排序(Insertion Sort)
c语言·数据结构·c++·算法·排序算法
奔跑吧邓邓子2 小时前
【C++实战⑦】C++函数实战:从基础到项目应用
c++·实战·函数
HMBBLOVEPDX2 小时前
C++(静态函数)
开发语言·c++
张晓~183399481213 小时前
短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
c语言·c++·人工智能·矩阵·c#·php·音视频
一枝小雨4 小时前
【C++】list 容器操作
开发语言·c++·笔记·list·学习笔记
HMBBLOVEPDX4 小时前
C++(继承和多态)
开发语言·c++·继承和多态
愚润求学5 小时前
【贪心算法】day8
c++·算法·leetcode·贪心算法