设计模式之——单例模式

单例模式的作用

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

一.饿汉机制

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

复制代码
#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;
}
相关推荐
David猪大卫8 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
零衣贰9 小时前
The 2026 ICPC Asia East Continent Online Contest (I) 题解
c++·icpc
fpcc10 小时前
c++编程实践—统一初始化
服务器·c++
Zenova EdgeOS11 小时前
C++ 工业边缘 libcurl HTTP 客户端实战
开发语言·c++·网络协议·边缘计算
Jackson_GJH11 小时前
Qt 右键自定义菜单的实现
开发语言·c++·qt
张小姐的猫12 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
一木 之林12 小时前
七、一-AI 工程实践、插件化调试与软件交付
java·linux·c++
Murphy_lx14 小时前
1124. 表现良好的最长时间段
c++·算法
luj_176816 小时前
一线一区一变破解人盯人防守密码
开发语言·网络·c++·经验分享·算法
广州山泉婚姻16 小时前
C/C++动态内存:堆内存的申请、使用与释放
c++·人工智能