欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)單例模式日志輸出詳解

 更新時(shí)間:2023年04月23日 17:07:33   作者:Thomas_Lbw  
這篇文章主要為大家詳細(xì)介紹了C++中單例模式的相關(guān)知識(shí),并給出單例模式日志實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

一、單例模式簡單介紹

1.1 基礎(chǔ)介紹

單例模式只保證一個(gè)程序內(nèi)只有一個(gè)實(shí)例存在,并提供全局訪問點(diǎn)來訪問該實(shí)例,其實(shí)就是單例模式的類對(duì)象只允許存在一個(gè),它和多線程思想恰恰相反,為的是保證操作資源的安全。比如日志系統(tǒng)需要記載時(shí)間的,如果多線程會(huì)搞得很亂。

實(shí)現(xiàn)單例模式的關(guān)鍵是構(gòu)造函數(shù)需要被設(shè)為私有,以防止外部代碼創(chuàng)建多個(gè)實(shí)例。同時(shí),需要提供一個(gè)靜態(tài)方法來獲取實(shí)例,這個(gè)方法會(huì)檢查是否已經(jīng)有一個(gè)實(shí)例存在,如果存在就返回這個(gè)實(shí)例,否則就創(chuàng)建一個(gè)新的實(shí)例并返回。

下面是一個(gè)簡單的 C++ 單例模式示例代碼:

class Singleton {
public:
  static Singleton* GetInstance() {
    if (instance_ == nullptr) {
      instance_ = new Singleton();
    }
    return instance_;
  }
 
  void DoSomething() {
    // ...
  }
 
private:
  Singleton() {
    // ...
  }
 
  static Singleton* instance_;
};
 
Singleton* Singleton::instance_ = nullptr;

1.2 單例模式使用場景

1.配置管理器:在一個(gè)應(yīng)用程序中,配置信息可能需要在多個(gè)地方被訪問,而且這些配置信息通常是只讀的。使用單例模式可以保證配置信息只被加載一次,同時(shí)提供一個(gè)全局訪問點(diǎn)來訪問配置信息。

2.日志記錄器:在一個(gè)應(yīng)用程序中,日志信息可能需要在多個(gè)地方被記錄,而且記錄器通常是只有一個(gè)的。使用單例模式可以保證只有一個(gè)日志記錄器被創(chuàng)建,并且提供一個(gè)全局訪問點(diǎn)來記錄日志信息。

3.數(shù)據(jù)庫連接池:在一個(gè)應(yīng)用程序中,需要連接數(shù)據(jù)庫的地方可能很多,而且數(shù)據(jù)庫連接通常是有限的資源。使用單例模式可以實(shí)現(xiàn)數(shù)據(jù)庫連接池,保證連接只被創(chuàng)建一次,并且提供一個(gè)全局訪問點(diǎn)來獲取連接。

4.計(jì)數(shù)器:在一個(gè)應(yīng)用程序中,可能需要對(duì)某個(gè)事件或操作進(jìn)行計(jì)數(shù)統(tǒng)計(jì),而且這些計(jì)數(shù)器通常是只有一個(gè)的。使用單例模式可以保證計(jì)數(shù)器只被創(chuàng)建一次,并且提供一個(gè)全局訪問點(diǎn)來進(jìn)行計(jì)數(shù)。

5.緩存管理器:在一個(gè)應(yīng)用程序中,需要對(duì)某些數(shù)據(jù)進(jìn)行緩存,而且緩存數(shù)據(jù)的容量通常是有限的。使用單例模式可以實(shí)現(xiàn)緩存管理器,保證緩存只被創(chuàng)建一次,并且提供一個(gè)全局訪問點(diǎn)來訪問緩存數(shù)據(jù)。

二、單例模式實(shí)現(xiàn)日志記錄(Singleton Logger)

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
 
using namespace std;
 
class Logger {
private:
    static Logger* instance;
    ofstream logFile;
 
    Logger() {
        string filename = "log.txt";
        logFile.open(filename.c_str(), ios::out | ios::app);
    }
 
public:
    static Logger* getInstance() {
        if (instance == NULL) {
            instance = new Logger();
        }
        return instance;
    }
 
    void log(string message) {
        time_t now = time(0);
        char* dt = ctime(&now);
        logFile << dt << ": " << message << endl;
    }
};
 
Logger* Logger::instance = NULL;
 
int main() {
    Logger* logger = Logger::getInstance();
    logger->log("Hello World!");
    return 0;
}

在上述代碼中,Logger類具有私有的構(gòu)造函數(shù)和一個(gè)私有的靜態(tài)成員變量instance。getInstance()函數(shù)是一個(gè)公有的靜態(tài)成員函數(shù),它返回Logger類的唯一實(shí)例。如果實(shí)例不存在,則創(chuàng)建一個(gè)新的實(shí)例。log()函數(shù)用于向日志文件寫入消息。

在main函數(shù)中,我們首先獲取Logger實(shí)例,然后調(diào)用log()函數(shù)記錄日志。由于Logger類是單例模式,因此在程序運(yùn)行期間只會(huì)有一個(gè)Logger實(shí)例存在,因此多次調(diào)用log()函數(shù)將在同一個(gè)文件中記錄日志。

請(qǐng)注意,由于單例模式在多線程環(huán)境下可能存在問題,因此需要進(jìn)行線程安全的處理。在本例中,我們忽略了線程安全問題,僅提供了單線程環(huán)境下的實(shí)現(xiàn)。

三、總結(jié)

單例模式很辛苦,很孤單,請(qǐng)善待單例模式。

到此這篇關(guān)于C++實(shí)現(xiàn)單例模式日志輸出詳解的文章就介紹到這了,更多相關(guān)C++單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C++ 中的臨時(shí)對(duì)象

    詳解C++ 中的臨時(shí)對(duì)象

    這篇文章主要介紹了C++ 中的臨時(shí)對(duì)象的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • 深入了解C++的多態(tài)與虛函數(shù)

    深入了解C++的多態(tài)與虛函數(shù)

    這篇文章主要為大家詳細(xì)介紹了C++多態(tài)與虛函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-07-07
  • C++實(shí)現(xiàn)LeetCode(60.序列排序)

    C++實(shí)現(xiàn)LeetCode(60.序列排序)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(60.序列排序),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹

    C語言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹

    這篇文章主要介紹了C語言 棧的表示和實(shí)現(xiàn)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 基于C語言實(shí)現(xiàn)鉆石棋游戲的示例代碼

    基于C語言實(shí)現(xiàn)鉆石棋游戲的示例代碼

    獨(dú)立鉆石是源于18世紀(jì)法國的宮廷貴族的自我挑戰(zhàn)類單人棋游戲,可以鍛煉邏輯思維能力。本文將用C語言實(shí)現(xiàn)這一簡單的游戲,感興趣的小伙伴可以了解一下
    2023-02-02
  • C++中自定義sleep、條件變量sleep實(shí)例

    C++中自定義sleep、條件變量sleep實(shí)例

    這篇文章主要介紹了C++中自定義sleep、條件變量sleep實(shí)例,本文直接給出實(shí)例代碼并講解了功能作用和使用方法,需要的朋友可以參考下
    2015-03-03
  • 尾遞歸詳細(xì)總結(jié)分析

    尾遞歸詳細(xì)總結(jié)分析

    關(guān)于遞歸操作,相信大家都已經(jīng)不陌生。簡單地說,一個(gè)函數(shù)直接或間接地調(diào)用自身,是為直接或間接遞歸
    2013-09-09
  • Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)csv文件轉(zhuǎn)xls

    Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)csv文件轉(zhuǎn)xls

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實(shí)現(xiàn)csv文件轉(zhuǎn)xls功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以了解一下
    2022-06-06
  • C++98/11/17表達(dá)式類別(小結(jié))

    C++98/11/17表達(dá)式類別(小結(jié))

    這篇文章主要介紹了C++98/11/17表達(dá)式類別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C語言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問題

    C語言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問題

    Dynamic Programming動(dòng)態(tài)規(guī)劃方法采用最優(yōu)原則來建立用于計(jì)算最優(yōu)解的遞歸式,并且考察每個(gè)最優(yōu)決策序列中是否包含一個(gè)最優(yōu)子序列,這里我們就來展示C語言使用DP動(dòng)態(tài)規(guī)劃思想解最大K乘積與乘積最大問題
    2016-06-06

最新評(píng)論