C++ 单例模式的几种实现方式研究

yizhihongxing

C++单例模式的几种实现方式研究

什么是单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证了一个类仅有一个实例,并提供一个全局访问点。

单例模式的应用场景

单例模式在以下情况下被广泛应用:

  • 需要频繁创建对象,但创建的对象又非常耗费系统资源。
  • 系统只需要一个实例对象,如系统日志、系统文件等。
  • 当多个实例存在时会导致访问的内容不一致或者状态不同步。

如何实现单例模式

饿汉式

饿汉式在类加载时就创建了对象实例,也就是说在调用该类的getInstance()方法之前就已经存在了该对象,因此线程安全,但可能会浪费一部分系统资源。

示例代码:

class Singleton {
private:
    static Singleton* instance;

    Singleton() {}

public:
    static Singleton* getInstance() {
        return instance;
    }
};

Singleton* Singleton::instance = new Singleton();

懒汉式

懒汉式在调用该类的getInstance()方法时才会创建对象实例,因此只有在使用时才会创建对象,避免了资源浪费,但线程不安全。

示例代码:

class Singleton {
private:
    static Singleton* instance;

    Singleton() {}

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;

双检锁/双重校验锁(DCL)

双检锁是指在getInstance()方法中进行双重判断,避免了资源的浪费和线程不安全问题。

示例代码:

class Singleton {
private:
    static Singleton* instance;
    static std::mutex mutex_;

    Singleton() {}

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex_);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }
};

Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;

静态变量

静态变量在程序启动时就创建了对象实例,因此保证线程安全,但是可能会浪费系统资源。

示例代码:

class Singleton {
private:
    Singleton() {}
    static const Singleton instance;

public:
    static const Singleton* getInstance() {
        return &instance;
    }
};

const Singleton Singleton::instance = Singleton();

如何选择合适的实现方式

饿汉式在类加载时就创建对象实例,没有线程安全问题,但可能会浪费一部分系统资源。

懒汉式只有在使用时才创建对象实例,避免了资源浪费,但是有线程不安全问题。

双检锁实现了线程安全,也避免了资源浪费。

静态变量在程序启动时就创建了对象实例,保证线程安全,但是可能会浪费系统资源。

因此,需要根据实际情况选择合适的实现方式。

总结

单例模式是一种常用的设计模式,在需要频繁创建对象、系统只需要一个实例对象、多个实例会导致状态不同步等情况下广泛使用。本文介绍了饿汉式、懒汉式、双检锁和静态变量四种实现方式,并分析了它们的优缺点,希望能够对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 单例模式的几种实现方式研究 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++详细讲解继承与虚继承实现

    我们来详细讲解一下C++中继承与虚继承的实现。 继承概述 在C++中,继承是面向对象编程的三大特性之一,它是一种类与类之间的关系,表示一个类可以使用另一个类的属性和方法。 继承有许多优点,比如: 复用已有代码 在现有代码的基础上构建新的类 提高代码的可扩展性和可维护性 继承的实现 在C++中,继承可以通过public、protected和private三种方…

    C 2023年5月22日
    00
  • 基于Python的文件类型和字符串详解

    基于Python的文件类型和字符串详解 文件类型 文本文件 文本文件是指计算机文件中只包含普通文本字符,不包含格式、字形等样式信息的文件。Python中打开文本文件的方法如下: with open(‘file.txt’, ‘r’) as f: content = f.read() 其中,’file.txt’是文件名,’r’表示只读模式,’with’语句保证了…

    C 2023年5月22日
    00
  • C语言switch语句详解

    C语言switch语句详解 简介 在C语言中,switch语句是一种多分支的选择结构,可以用来比对多个值,根据不同的值来执行对应的代码块。 语法 switch语句的基本语法如下: switch(expression){ case constant-expression1: statement(s); break; case constant-expressi…

    C 2023年5月24日
    00
  • C语言简明讲解操作符++和–的使用方法

    C语言简明讲解操作符++和–的使用方法 操作符++和–的基本概念 操作符++和–是C语言中的两种自增、自减操作符。它们作用于一个变量,可以将该变量的值自增1或自减1。 操作符++:将变量的值自增1,等同于var = var + 1。 操作符–:将变量的值自减1,等同于var = var – 1。 这两个操作符都可以在变量前面或后面使用,从而分别产生前…

    C 2023年5月23日
    00
  • C++ OpenCV实现像素画的示例代码

    首先,实现像素画需要使用C++和OpenCV两个工具,并且需要计算出每个像素块的颜色,然后绘制出来。下面是一份C++ OpenCV实现像素画的示例代码攻略: 准备工作 在开始之前,需要在本地安装好以下工具: C++编译工具(比如Visual Studio) OpenCV图像处理库 安装好之后,需要在代码中引入OpenCV相关头文件,比如: #include …

    C 2023年5月24日
    00
  • C语言中如何进行函数定义和调用?

    在C语言中,函数是代码的重要组成部分,有助于提高代码的复用性和可读性。函数定义通常包括函数名、参数和函数体,可以用来完成特定的任务。下面是C语言中如何进行函数定义和调用的详细攻略。 函数定义 C语言中函数定义分为两部分:函数头和函数体。函数头通常包括函数名和参数声明,参数声明可以为空。函数体是实现函数功能的代码块。 下面是一个函数定义的示例: int max…

    C 2023年4月27日
    00
  • C++面试常见问题整理汇总

    C++面试常见问题整理汇总 本文旨在整理和汇总C++面试中常见的问题,包括但不限于基础知识、语法、实际应用等方面,并提供相应的解答和说明以供参考。 1. 基础知识 1.1 C++的数据类型有哪些?它们所占用的字节空间分别是多少? C++的数据类型包括基本数据类型和构造类型,其中基本数据类型有: 整型(int、short、long、long long等) 布尔…

    C 2023年5月22日
    00
  • C++虚函数及虚函数表简析

    C++虚函数及虚函数表简析 虚函数 在C++中,通过将类中的某个成员函数定义为虚函数,使得该成员具有多态性质。当我们通过指向派生类对象的基类指针或引用调用虚函数时,实际上会根据这个指针或引用所指向的对象类型,动态地调用该类的对应虚函数,而不是调用基类中定义的虚函数。 虚函数的定义格式如下: class Base { public: virtual void …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部