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

设计模式之——单例模式

单例模式的作用

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

一.饿汉机制

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

#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;
}


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

相关文章:

  • HarmonyOS Next星河版笔记--界面开发(5)
  • Hadoop 学习心得
  • 医院信息化与智能化系统(21)
  • Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
  • 一文说清libc、glibc、glib的发展和关系
  • C#从入门到放弃
  • Golang--网络编程
  • 【专题】2024年全球生物医药交易报告汇总PDF洞察(附原数据表)
  • quartz
  • 【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(4)
  • ReactNative中实现图片保存到手机相册
  • 3.PyCharm工具
  • virtualBox部署minikube+istio
  • Java项目实战II基于Java+Spring Boot+MySQL的高校办公室行政事务管理系统(源码+数据库+文档)
  • 速盾:vue的cdn是干嘛的?
  • Rust-AOP编程实战
  • vue2 -- el-form组件动态增减表单项及表单项验证
  • 关于我重生到21世纪学C语言这件事——三子棋游戏!
  • Java打造智能语音陪聊软件?提升用户体验的新路径
  • 【数据集】【YOLO】【目标检测】树木倒塌识别数据集 9957 张,YOLO道路树木断裂识别算法实战训练教程!
  • 让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片
  • python externally-managed-environment 外部管理环境
  • Kotlin 协程使用及其详解
  • 【go从零单排】结构嵌套struct embedding
  • C# 独立线程
  • 【Qwen2技术报告分析】解读模型架构 pre/post数据构建和模型评估