首页 > 编程语言 >单例模式C++实现

单例模式C++实现

时间:2023-11-14 10:33:04浏览次数:37  
标签:std SingleObject 模式 instance C++ 单例 cout

单例模式

全局静态变量实现饿汉式单例模式

饿汉式实现方式是线程安全的。

#include using namespace std; 
/* 饿汉式单例模式 */ 
class SingleObject{ 
    private: 
        static SingleObject instance; 
        SingleObject(){
            std::cout << "Singleton instance created." << std::endl;
        }
    public: 
        static SingleObject get_instance(){ 
        return instance; //非静态成员是不存在,是无法返回实例的 
        } 
        void show_message(); 
};
SingleObject SingleObject::instance;
int main(){ 
    cout << "---------主线程开始---------" << endl;
    SingleObject::get_instance().show_message(); 
    cout << "---------主线程结束---------" << endl; 
    return 0; 
} 

void SingleObject::show_message(){ 
    cout << "完成了单例模式" << endl; }

局部静态变量实现懒汉单例模式

这种也是线程安全的单例模式实现,实现原则是局部静态变量实现,返回引用

//更简单的线程安全初始化 
#include using namespace std; 
class SingleObject{ 
    private: 
        SingleObject(){
            std::cout << "Singleton instance created." << std::endl;
        }
    public: 
        //这里返回类型为引用可以避免对对象的复制,以及拷贝构造函数和析构函数的调用,开销小。
        static SingleObject& get_instance(){ 
            static SingleObject instance;//局部静态变量实现单例模式
            return instance; //非静态成员是不存在,是无法返回实例的 
        } 
        void show_message(); 
};

int main(){ 
    cout << "---------主线程开始---------" << endl; 
    SingleObject& my_instance = SingleObject::get_instance();
    my_instance.show_message(); 
    cout << "---------主线程结束---------" << endl; return 0;
} 

void SingleObject::show_message(){
     cout << "完成了单例模式" << endl; 
} 

指针实现懒汉单例模式

此方式未加互斥锁,是不线程安全的

#include <iostream>
using namespace std;
/* 饿汉式单例模式 */
class SingleObject
{
private:
    static SingleObject *instance; // 通过指针延迟初始化
    SingleObject() { std::cout << "Singleton instance created." << std::endl; }

public:
    static SingleObject* get_instance()
    {
        if (instance == nullptr) //多线程在执行判断条件时,可能同时发现都是nullptr,同时实例化多个对象。线程不安全
            instance = new SingleObject();
        return instance; //实例的指针
    }
    void show_message();
};

SingleObject* SingleObject::instance = nullptr;
int main()
{
    cout << "---------主线程开始---------" << endl;
    SingleObject* instance = SingleObject::get_instance();
    (*instance).show_message();
    cout << "---------主线程结束---------" << endl;
    return 0;
}
void SingleObject::show_message()
{
    cout << "完成了单例模式" << endl;
}

指针加互斥量实现懒汉单例模式

这种互斥量加锁实现方式是线程安全的

#include <iostream>
#include <mutex>

/* 饿汉式单例模式 */
class SingleObject
{
private:
    static SingleObject *instance; // 通过指针延迟初始化
    SingleObject() { std::cout << "Singleton instance created." << std::endl; }
    static std::mutex mtx;//新建一个互斥量,预备实现线程安全
public:
    static SingleObject* get_instance()
    {
        if (instance== nullptr){
            std::lock_guard<std::mutex> lock(mtx);
            if(instance == nullptr)
            instance = new SingleObject();
        }
        return instance; //实例的指针
    }
    void show_message();
};
SingleObject* SingleObject::instance = nullptr; //指针初始化
std::mutex SingleObject::mtx;//初始化 互斥锁
int main()
{
    std::cout << "---------主线程开始---------" << std::endl;
    SingleObject* instance = SingleObject::get_instance();
    (*instance).show_message();//或者使用instance->show_message()
    std::cout << "---------主线程结束---------" << std::endl;
    return 0;
}
void SingleObject::show_message()
{
    std::cout << "完成了单例模式" << std::endl;
}

标签:std,SingleObject,模式,instance,C++,单例,cout
From: https://www.cnblogs.com/solicit/p/17831061.html

相关文章

  • C++模拟键盘操作
    前言:C++/C语言模拟键盘操作十分的黑科技啊,作者也是借鉴了C/C++模拟键盘操作(一)_折竹丶的博客-CSDN博客_c++模拟键盘​​​​​​​​​​​​​​  来做一个小小的全面总结,有兴趣可以去看原创 键盘操作:在C++中有一个头文件:windows.h我们可以尝试导入他: #include<......
  • C++ Primer学习笔记——第十一章
    第十一章关联容器前言关联容器和顺序容器有着本质的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。(MySQL中元素就是按照关联容器进行保存)关联容器支持高效的关键字查找和访问。两个主要的关联容器(assoc......
  • C++多态
    1、静态多态(1)函数重载 函数重载以参数的类型或数量不同来区分不同用途的同名函数。不以返回值不同来区分函数。编译器在调用函数时会在意函数的参数,不会在意函数的返回值。intmyAdd(inta,intb);floatmyAdd(doublea,doubleb);(2)运算符重载 使用关键字operator来......
  • 享元模式
    说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象“adam“,下次再......
  • Hash模式基于锚点,以及onhashchange事件 —— 通过锚点的值作为路由地址
    前端路由有两种模式:mode:hash/histroyhash:1.hash的优点是兼容性比较高,可以直接在项目布署上线时使用。2.hash的缺点是#不美观影响url的美感,并且如果移动端分享严格限制,可能会报错history:1.history的优点是不会影响到url的美感,提高了可观赏性2.history的缺点是需要与后端搭配,......
  • C/C++知识补充
    运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符运算符描述实例+把两个操作数相加A+B将得到30-从第一个操作数中减去第二个操作数A-B将得到-10*把两个操作数相乘A*B将得到200/分子除以分母B/A将得到......
  • 学习随笔(设计模式:面向对象原则)
    内容今天学习了面向对象的几种设计思想原则,之前一直是C开发,所以面向过程的思想比较严重。面向对象的四个好处:可维护好、可拓展性好、可复用性好、灵活性好。收获1.单一职责原则:封装一个类,职责应该单一,仅有一个以其它变换的原因,所以要做好类的职责分离。2.开放-封闭原则:软件实......
  • Linux Ubuntu部署C++环境与VS Code编辑器
      本文介绍在LinuxUbuntu操作系统下,配置VisualStudioCode软件与C++代码开发环境的方法。  在文章VMware虚拟机中安装LinuxUbuntu操作系统中,我们介绍了LinuxUbuntu操作系统的下载、安装方法;本文则基于前述基础,继续介绍在LinuxUbuntu操作系统中配置VisualStudioCode软......
  • 【Redis】Cluster集群模式
    (目录)RedisCluster集群模式Cluster模式是Redis3.0开始推出采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接官方要求:至少6个节点才可以保证高可用,即3主3从;扩展性强、更好做到高可用各个节点会互相通信,采用gossip协议交换节点元数据信息数......
  • C++ 字符串类 string
    @TOC前言在C++中,字符串是一种常见的数据类型,用于存储和操作文本数据。C++标准库中提供了std::string类,它是一个功能强大的字符串类,提供了丰富的方法和操作符,使我们能够轻松地处理字符串。一、string类型概括std::string是C++标准库中定义的字符串类,它在<string>头文件中声明。它......