C++实现 单例模式实例详解

C++实现单例模式实例详解

什么是单例模式

单例模式是一种创建型设计模式,这种模式的主要特点是只能创建一个实例对象,该实例对象可以在系统内部被任何方法访问和共享。单例模式在许多场景下都有着广泛的应用,比如Spring中的Bean管理、数据库连接池等等。

单例模式的实现方法

在C++中,实现单例模式主要有两种方式:懒汉式和饿汉式。其中懒汉式是在第一次使用时创建实例,而饿汉式是在程序启动时就创建实例。下面分别对这两种方式进行详细的讲解。

懒汉式

懒汉式缺点是线程不安全,需要加锁保证线程安全。

class Singleton{
  public:
    static Singleton* getInstance();
    ~Singleton();
  private:
    Singleton();

    static Singleton* instance;
    static mutex mtx;
};

Singleton* Singleton::instance = NULL;
mutex Singleton::mtx;

Singleton::Singleton(){}

Singleton* Singleton::getInstance()
{
    if(instance == NULL){
        lock_guard<mutex> lk(mtx);
        if(instance == NULL){
            instance = new Singleton();
        }
    }
    return instance;
}

Singleton::~Singleton()
{
    delete instance;
}

饿汉式

饿汉式实现简单,但无法延迟实例的创建,有一定的资源浪费风险。

class Singleton{
  public:
    static Singleton* getInstance();
    ~Singleton();
  private:
    Singleton(){}

    static Singleton* instance;
};

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

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

Singleton::~Singleton()
{
    delete instance;
}

单例模式的示例说明

示例一

以懒汉式单例模式为例,假设现在要实现一个日志系统,该系统需要保证只能被初始化一次并可以全局访问。下面是实现代码:

// Logger.h
class Logger{
  public:
    static Logger* getLogger();
    void log(string msg);
    ~Logger();
  private:
    Logger();

    static Logger* instance;
    static mutex mtx;
};

// Logger.cpp
Logger* Logger::instance = NULL;
mutex Logger::mtx;

Logger::Logger(){}

Logger* Logger::getLogger()
{
    if(instance == NULL){
        lock_guard<mutex> lk(mtx);
        if(instance == NULL){
            instance = new Logger();
        }
    }
    return instance;
}

void Logger::log(string msg)
{
    cout << "Log: " << msg << endl;
}

Logger::~Logger()
{
    delete instance;
}

示例二

再以饿汉式单例模式为例,假设现在要实现一个配置管理系统,该系统需要在程序启动时就加载配置,并且保证只加载一次。下面是实现代码:

// Config.h
class Config{
  public:
    static Config* getConfig();
    void setConfig(string key, string value);
    string getConfig(string key);
    ~Config();
  private:
    Config();

    static Config* instance;
    map<string, string> configMap;
};

// Config.cpp
Config* Config::instance = new Config();

Config::Config(){}

Config* Config::getConfig()
{
    return instance;
}

void Config::setConfig(string key, string value)
{
    configMap[key] = value;
}

string Config::getConfig(string key)
{
    return configMap[key];
}

Config::~Config()
{
    delete instance;
}

总结

单例模式是一种非常实用的设计模式,可以用来保证全局只有一个实例对象,并且可以在系统的任意位置访问该对象。本文分别介绍了懒汉式和饿汉式两种单例模式的实现方法,并且给出了两个示例说明。在实际开发中,我们可以根据具体场景选择合适的方式来实现单例模式。

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

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

相关文章

  • C语言预处理预编译命令及宏定义详解

    C语言预处理预编译命令及宏定义详解 C语言中有一种预处理器,可以利用预处理指令在编译之前进行文本替换、宏定义、条件编译等操作,这种预处理器就是C语言预处理器。本文将介绍C语言预处理器的使用方法和一些常见的预处理命令及宏定义的详解。 预处理命令 C语言预处理器使用一些特殊的指令进行预处理,下面列举了一些常见的预处理命令: include #include &l…

    C 2023年5月23日
    00
  • python中的Json模块dumps、dump、loads、load函数用法详解

    下面是关于 Python 中的 Json 模块 dumps、dump、loads、load 函数的使用详解: Json 简介 Json是一种基于文本的轻量级数据交换格式,常用于前后端数据交互、配置文件等场合。在 Python 中,可以使用 Json 模块来对 Json 数据进行解析和生成。 Json 模块函数说明 dumps 函数 dumps 函数将一个 P…

    C 2023年5月23日
    00
  • C语言实现学生考勤系统

    C语言实现学生考勤系统攻略 1. 分析需求 在开始开发学生考勤系统之前,需要充分理解用户需求、设计应用程序的基本架构和数据结构,简单的需求分析可以从以下方面考虑: 学生信息管理:包括学生姓名、学生学号、学生成绩等信息的管理。 学生考勤管理:包括教师是否缺勤,学生是否缺勤,考勤时间等方面的管理。 2. 设计基本架构 在理解了需求后,需要考虑所实现的程序的基本架…

    C 2023年5月23日
    00
  • 用C语言实现一个扫雷小游戏

    用C语言实现一个扫雷小游戏 前言 扫雷是一个经典的小游戏,能够提高我们的逻辑思考能力和对数字的感知。C语言作为一种高效的编程语言,也可以用来实现这样的小游戏。下面我将详细讲解如何用C语言实现一个扫雷小游戏。 思路 扫雷可以看成是一个矩形的区域,其中有一些格子里面藏着地雷,而其他的格子则是空的。游戏的目标是找出所有的空格子,同时避免踩到地雷。 因此,我们需要实…

    C 2023年5月23日
    00
  • 使用C++进行Cocos2d-x游戏开发入门过程中的要点解析

    使用C++进行Cocos2d-x游戏开发入门过程中的要点解析 1. 环境搭建 在C++进行Cocos2d-x游戏开发之前,需要先搭建好开发环境。搭建环境的步骤主要包括以下几个步骤: 安装Cocos2d-x:在官网下载Cocos2d-x最新版本,并安装配置好环境变量。 安装开发工具:根据个人喜好选择一个适合自己的开发工具,比如Visual Studio或者Xc…

    C 2023年5月24日
    00
  • VS2019连接MySQL数据库的过程及常见问题总结

    VS2019连接MySQL数据库的过程及常见问题总结 1. 下载MySQLConnector/C++ 在Visual Studio 2019中使用MySQL数据库,我们需要先安装MySQLConnector/C++库。我们可以在MySQL官网上下载MySQLConnector/C++。下载地址如下:https://dev.mysql.com/download…

    C 2023年5月23日
    00
  • Visual Studio Code配置C/C++开发环境的教程图解

    下面是详细的攻略: Visual Studio Code配置C/C++开发环境的教程图解 一、安装Visual Studio Code 首先,我们需要安装Visual Studio Code,可以直接在官网下载安装包进行安装。安装完成后,打开VS Code。 二、安装C/C++扩展 在VS Code中,我们需要安装C/C++扩展,为C/C++开发提供支持。在…

    C 2023年5月23日
    00
  • qt获取当前时间(QDateTime、QTime、QDate)

    获取当前时间是编程中常见的需求,而Qt库提供了方便易用的日期和时间处理类,包括QDateTime、QTime、QDate等。下面是获取当前时间的完整攻略: QDateTime QDateTime是Qt库中用于表示日期和时间的类,可以表示某个特定的日期和时间,也可以同时表示日期和时间。 首先需要包含头文件QDateTime: #include <QDat…

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