C++實現(xiàn)單例模式日志輸出詳解
一、單例模式簡單介紹
1.1 基礎介紹
單例模式只保證一個程序內(nèi)只有一個實例存在,并提供全局訪問點來訪問該實例,其實就是單例模式的類對象只允許存在一個,它和多線程思想恰恰相反,為的是保證操作資源的安全。比如日志系統(tǒng)需要記載時間的,如果多線程會搞得很亂。
實現(xiàn)單例模式的關鍵是構造函數(shù)需要被設為私有,以防止外部代碼創(chuàng)建多個實例。同時,需要提供一個靜態(tài)方法來獲取實例,這個方法會檢查是否已經(jīng)有一個實例存在,如果存在就返回這個實例,否則就創(chuàng)建一個新的實例并返回。
下面是一個簡單的 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.配置管理器:在一個應用程序中,配置信息可能需要在多個地方被訪問,而且這些配置信息通常是只讀的。使用單例模式可以保證配置信息只被加載一次,同時提供一個全局訪問點來訪問配置信息。
2.日志記錄器:在一個應用程序中,日志信息可能需要在多個地方被記錄,而且記錄器通常是只有一個的。使用單例模式可以保證只有一個日志記錄器被創(chuàng)建,并且提供一個全局訪問點來記錄日志信息。
3.數(shù)據(jù)庫連接池:在一個應用程序中,需要連接數(shù)據(jù)庫的地方可能很多,而且數(shù)據(jù)庫連接通常是有限的資源。使用單例模式可以實現(xiàn)數(shù)據(jù)庫連接池,保證連接只被創(chuàng)建一次,并且提供一個全局訪問點來獲取連接。
4.計數(shù)器:在一個應用程序中,可能需要對某個事件或操作進行計數(shù)統(tǒng)計,而且這些計數(shù)器通常是只有一個的。使用單例模式可以保證計數(shù)器只被創(chuàng)建一次,并且提供一個全局訪問點來進行計數(shù)。
5.緩存管理器:在一個應用程序中,需要對某些數(shù)據(jù)進行緩存,而且緩存數(shù)據(jù)的容量通常是有限的。使用單例模式可以實現(xiàn)緩存管理器,保證緩存只被創(chuàng)建一次,并且提供一個全局訪問點來訪問緩存數(shù)據(jù)。
二、單例模式實現(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類具有私有的構造函數(shù)和一個私有的靜態(tài)成員變量instance。getInstance()函數(shù)是一個公有的靜態(tài)成員函數(shù),它返回Logger類的唯一實例。如果實例不存在,則創(chuàng)建一個新的實例。log()函數(shù)用于向日志文件寫入消息。
在main函數(shù)中,我們首先獲取Logger實例,然后調(diào)用log()函數(shù)記錄日志。由于Logger類是單例模式,因此在程序運行期間只會有一個Logger實例存在,因此多次調(diào)用log()函數(shù)將在同一個文件中記錄日志。
請注意,由于單例模式在多線程環(huán)境下可能存在問題,因此需要進行線程安全的處理。在本例中,我們忽略了線程安全問題,僅提供了單線程環(huán)境下的實現(xiàn)。
三、總結
單例模式很辛苦,很孤單,請善待單例模式。
到此這篇關于C++實現(xiàn)單例模式日志輸出詳解的文章就介紹到這了,更多相關C++單例模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Qt數(shù)據(jù)庫應用之實現(xiàn)csv文件轉xls
這篇文章主要為大家詳細介紹了如何利用Qt實現(xiàn)csv文件轉xls功能,文中的示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以了解一下2022-06-06C語言使用DP動態(tài)規(guī)劃思想解最大K乘積與乘積最大問題
Dynamic Programming動態(tài)規(guī)劃方法采用最優(yōu)原則來建立用于計算最優(yōu)解的遞歸式,并且考察每個最優(yōu)決策序列中是否包含一個最優(yōu)子序列,這里我們就來展示C語言使用DP動態(tài)規(guī)劃思想解最大K乘積與乘積最大問題2016-06-06