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日

相关文章

  • win7系统玩饥荒游戏出现error during initialization提示该如何解决?

    解决“win7系统玩饥荒游戏出现error during initialization提示”的步骤如下: 1. 确认硬件和软件要求 首先,要确认自己的电脑是否满足饥荒游戏的硬件和软件要求。在游戏官网或者其他相关网站上可以找到这些要求。比如,饥荒游戏的最低要求为: 操作系统:Windows XP/Vista/7/8(32位或64位) 处理器:1.7 GHz或更…

    C 2023年5月22日
    00
  • 算法详解之分治法具体实现

    算法详解之分治法具体实现 分治法是一种经典的算法思想,通常应用于一些问题规模较大、难以直接解决的情况下。该算法思想的核心是把问题划分成一些小的子问题,然后递归求解这些子问题,最后将子问题的结果合并起来得到原始问题的解。这种算法思想在计算机智能、信息检索、图像识别等领域有广泛应用。 分治法具体实现的步骤 下面详细讲解分治法的具体实现步骤: 将原始问题划分成若干…

    C 2023年5月23日
    00
  • 浅析C++ atomic 和 memory ordering

    浅析C++ atomic 和 memory ordering 简介 C++11 中引入了一个新的原子类型 —— std::atomic,用以在多线程环境中实现原子操作。同时,它也提供了 Memory Ordering 来确保原子操作的顺序性。本文将从理论和实践角度浅析 C++ atomic 和 memory ordering。 原子操作 原子操作是指一个操作…

    C 2023年5月23日
    00
  • 如何修改MYSQL5.7.17数据库存储文件的路径

    以下是具体的攻略,分为以下几个步骤: 1. 关闭MySQL数据库 在开始修改MySQL数据库存储文件的路径之前,需要先关闭MySQL数据库,具体操作可以参照以下命令: sudo /etc/init.d/mysql stop 2. 复制原存储文件内容 在进行路径修改之前,需要先将原来的存储文件内容复制到将要修改的路径下,具体操作可以参照以下命令: sudo c…

    C 2023年5月23日
    00
  • C++编写实现图书管理系统

    C++编写实现图书管理系统的完整攻略 什么是图书管理系统 图书管理系统是一种方便图书馆或图书室管理图书的工具,可以通过计算机系统实现。 系统功能 图书管理系统的设计至少应包括以下功能: 图书信息的录入 图书信息的查询、浏览与修改 图书借阅、归还、预约与罚款管理 数量统计和管理 用户信息、权限管理 系统数据备份与恢复 开发步骤 Step 1: 掌握C++语言和…

    C 2023年5月23日
    00
  • c++ 判断是64位还是32位系统的实例

    当我们需要在C++程序中进行操作系统相关的操作时,有时候需要知道当前操作系统的位数,即是32位还是64位系统。本篇攻略将给出两个示例,分别介绍如何判断当前操作系统的位数。 1. 使用宏: 在C++中我们可以使用宏来判断当前操作系统的位数。以下是几个标准宏的定义: _M_IX86 // 32位系统 _M_X64 // 64位系统 我们可以通过检测这些宏来判断当…

    C 2023年5月23日
    00
  • C++构造和解析Json的使用示例

    C++构造和解析Json的使用示例 简介 Json是一种轻量级的数据交换格式,常用于前后端数据传输、配置文件等。本文将介绍在C++中如何构造和解析Json数据。 Json库 C++中有很多称手的Json库,常用的有: RapidJson nlohmann/json C++ Json 这些库都提供了简单易用的Api,形式上大同小异,具体使用可以结合文档查询。 …

    C 2023年5月23日
    00
  • C语言队列和应用详情

    C 语言队列和应用详情 什么是队列 队列是一种数据结构,可以用来存储一组按顺序排列的元素。队列的特点就是先进先出,即First In First Out,缩写为 FIFO。也就是说,最先插入队列的元素会最先被取出,最后插入队列的元素则会最后被取出。常见的生活中队列应用包括的排队取号,排队坐火车,排队打饭等等。 C 语言实现队列 在 C 语言中,我们可以通过数…

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