设计模式之——单例模式

单例模式的作用

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

一.饿汉机制

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

复制代码
#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;
}
相关推荐
Hello:CodeWorld22 分钟前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
搬砖魁首3 小时前
基础能力系列 - 多线程2 - 条件变量
c++·rust·条件变量·原子类型·线程同步互斥
chase_my_dream3 小时前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
牛油果子哥q3 小时前
【C++ STL string 】C++ STL string 终极精讲:底层原理、内存机制、全套API、深浅拷贝、易错坑点与工程实战规范
数据库·c++
凡人叶枫5 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
不想写代码的星星5 小时前
std::move 根本不移动,就像老婆饼里没有老婆
c++
redaijufeng5 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油6 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
思麟呀6 小时前
C++11 核心特性(三):强类型枚举、static_assert 与 std::tuple
开发语言·c++
一拳一个呆瓜6 小时前
【STL】C++程序的启动与终止
c++·stl