單例模式的使用場景 以及 餓漢式寫法(智能指針)

單例模式的使用場景 以及 餓漢式寫法(智能指針)

      • 餓漢式:創建類時就已經創建好了類的實例(用智能指針實現)
      • 什么時候用單例模式:
        • 1. 全局配置管理
        • 2. 日志系統
        • 3. 資源管理器
        • 4. 硬件設備訪問
        • 總結

餓漢式:創建類時就已經創建好了類的實例(用智能指針實現)

#include <memory>
class Single
{
private:Single(){}~Single(){}Single(const Single& single)=delete;Single& operator=(const Single& single)=delete;
private:static std::shared_ptr<Single> singlePtr;
public://獲取實例static std::shared_ptr<Single>& getInstance(){return singlePtr;}
};
std::shared_ptr<Single> singlePtr=std::make_shared<Single>();

什么時候用單例模式:

1. 全局配置管理

當需要集中管理 全局配置數據 時(如數據庫連接參數、系統路徑配置),使用單例模式可確保所有模塊訪問的是同一份配置數據。例如:

class ConfigManager {
public:static ConfigManager& getInstance() {static ConfigManager instance;return instance;}std::string getValue(const std::string& key) const;
private:std::unordered_map<std::string, std::string> configMap;
};

所有組件通過ConfigManager::getInstance()獲取統一配置

2. 日志系統

日志記錄器需要保證 全局唯一的輸出通道,避免多線程環境下 日志文件被重復打開:

Logger::getInstance().writeLog("System initialized");

這里的單例就是指唯一的日志輸出通道

3. 資源管理器

管理數據庫連接池、線程池等稀缺資源時,單例模式可確保 資源分配策略 的一致性:

ConnectionPool& pool = ConnectionPool::getInstance();
auto conn = pool.getConnection(); // 統一分配連接

這個單例就是這個線程池

4. 硬件設備訪問

對打印機、串口等獨占式硬件設備的訪問控制,單例模式能防止設備沖突:

SerialPort::getInstance().sendData(dataBuffer);
類似于管理日志輸出通道
總結

如果確定這個類的實例 在全局只有一個,那么就可以試試單例模式,總歸有好處。另外,餓漢式 啟動時(即加載類時)立即初始化,適合資源預分配場景。懶漢式 延遲初始化,首次調用時創建,節省啟動時間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76650.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序的全局變量(quanjubianliang)

在微信小程序開發中&#xff0c;管理和使用全局變量是一種常見的需求。例如&#xff0c;可以通過小程序的App實例和globalData對象來實現全局變量的存儲和共享。以下是詳細說明&#xff1a; 1. 全局變量的定義 微信小程序提供了 App() 函數&#xff0c;其中可以定義一個 global…

Latex科研入門教程

Introduction 這篇文章適合有markdown基礎的人看,不會的人可以先去學一下markdown. 僅適用于科研入門. 本文使用的latex環境為overleaf Latex概況 文件格式 以.tex為結尾的文件可能有多個.tex文件最終只編譯一個文件,相當于一個文件控制其他子文件. Latex 代碼分為三種&…

FastGPT Docker Compose本地部署與硅基流動免費AI接口集成指南

本文參考&#xff1a;https://doc.tryfastgpt.ai/docs/development/ 一、背景與技術優勢 FastGPT是基于LLM的知識庫問答系統&#xff0c;支持自定義數據訓練與多模型接入。硅基流動&#xff08;SiliconFlow&#xff09;作為AI基礎設施平臺&#xff0c;提供高性能大模型推理引…

19_大模型微調和訓練之-基于LLamaFactory+LoRA微調LLama3

基于LLamaFactory微調_LLama3的LoRA微調 1. 基本概念1.1. LoRA微調的基本原理1.2. LoRA與QLoRA1.3. 什么是 GGUF 2.LLaMA-Factory介紹3. 實操3.1 實驗環境3.2 基座模型3.3 安裝 LLaMA-Factory 框架3.3.1 前置條件 3.4 數據準備3.5 微調和訓練模型torch.cuda.OutOfMemoryError: …

Linux Wlan-四次握手(eapol)框架流程

協議基礎 基于 IEEE 802.1X 標準實現的協議 抓包基礎 使用上一章文章的TPLINK wn722n v1網卡在2.4G 頻段抓包&#xff08;v2、v3是不支持混雜模式的&#xff09; eapol的四個交互流程 根據不同的認證模式不同&#xff0c;兩者的Auth流程有所不同&#xff0c;但是握手流程基…

基于亞馬遜云科技 Amazon Bedrock Tool Use 實現 Generative UI

背景 在當前 AI 應用開發浪潮中&#xff0c;越來越多的開發者專注于構建基于大語言模型&#xff08;LLM&#xff09;的 chatbot 和 AI Agent。然而&#xff0c;傳統的純文本對話形式存在局限性&#xff0c;無法為用戶提供足夠直觀和豐富的交互體驗。為了增強用戶體驗&#xff…

第 2 篇:初探時間序列 - 可視化與基本概念

第 2 篇&#xff1a;初探時間序列 - 可視化與基本概念 (圖片來源: Luke Chesser on Unsplash) 在上一篇《你好&#xff0c;時間序列&#xff01;》中&#xff0c;我們了解了什么是時間序列數據以及學習它的重要性。現在&#xff0c;是時候卷起袖子&#xff0c;真正開始接觸和探…

Linux服務器配置Anaconda環境、Pytorch庫(圖文并茂的教程)

引言&#xff1a;為了方便后續新進組的 師弟/師妹 使用課題組的服務器&#xff0c;特此編文&#xff08;ps&#xff1a;我導從教至今四年&#xff0c;還未招師妹&#xff09; ? NLP 研 2 選手的學習筆記 筆者簡介&#xff1a;Wang Linyong&#xff0c;NPU&#xff0c;2023級&a…

Spring-AOP分析

Spring分析-AOP 1.案例引入 在上一篇文章中&#xff0c;【Spring–IOC】【https://www.cnblogs.com/jackjavacpp/p/18829545】&#xff0c;我們了解到了IOC容器的創建過程&#xff0c;在文末也提到了AOP相關&#xff0c;但是沒有作細致分析&#xff0c;這篇文章就結合示例&am…

【Python網絡爬蟲開發】從基礎到實戰的完整指南

目錄 前言&#xff1a;技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊技術選型對比 二、實戰演示環境配置要求核心代碼實現&#xff08;10個案例&#xff09;案例1&#xff1a;基礎靜態頁面抓取案例2&#xff1a;動…

服務器監控軟件推薦

以下是幾款常用的服務器監控軟件推薦&#xff0c;涵蓋開源和商業方案&#xff0c;適用于不同規模和需求&#xff1a; 一、開源免費方案 Prometheus Grafana 特點&#xff1a;時序數據庫 可視化儀表盤&#xff0c;支持多維度監控和告警。適用場景&#xff1a;云原生、Kubernet…

編譯原理實驗(四)———— LR(1)分析法

一、實驗目的 掌握LR(1)分析法的基本原理與實現流程。通過構造LR(1)分析表&#xff0c;驗證符號串是否符合給定文法規則。理解LR(1)分析中向前搜索符&#xff08;Lookahead Symbol&#xff09;的作用&#xff0c;解決移進-歸約沖突。 二、實驗題目 1.對下列文法&#xff0c;用…

vue3 主題模式 結合 element-plus的主題

vue3 主題模式 結合 element-plus的主題 npm i element-plus --save-dev在 Vue 3 中&#xff0c;實現主題模式主要有以下幾種方式 1.使用 CSS 變量&#xff08;自定義屬性&#xff09; CSS 變量是一種在 CSS 中定義可重用值的方式。在主題模式中&#xff0c;可以將顏色、字體…

科大訊飛Q1營收46.6億同比增長27.7%,扣非凈利同比增長48.3%

4月21日盤后&#xff0c;AI龍頭科大訊飛&#xff08;002230.SZ&#xff09;發布2024年報&#xff0c;公司全年實現營業收入233.43億元&#xff0c;同比增長18.79%&#xff0c;同期歸母凈利潤為5.6億元。 公司核心賽道業務保持快速增長&#xff0c;消費者、教育、汽車、醫療業務…

Day5-UFS總結

UFS 傳輸協議的本質&#xff1a;兩個收發器件&#xff0c;對需要傳輸的數據&#xff0c;一層一層的封裝和解析&#xff0c;利用封裝增加的額外信息&#xff0c;做一些數據處理&#xff0c;完成源地址到目標地址的數據傳輸功能。 應用協議的本質&#xff1a;基于某種傳輸協議之…

嵌入式工程師( C / C++ )筆試面試題匯總

注&#xff1a;本文為 “嵌入式工程師筆試面試題” 相關文章合輯。 未整理去重。 如有內容異常&#xff0c;請看原文。 嵌入式必會 C 語言筆試題匯總 Z 沉浮 嵌入式之旅 2021 年 01 月 19 日 00:00 用預處理指令 #define 聲明一個常數&#xff0c;用以表明 1 年中有多少秒&a…

29-JavaScript基礎語法(函數)

知識目標 理解函數的基本概念&#xff1b;掌握函數的定義和調用&#xff1b;理解函數參數和返回值及作用域&#xff1b;掌握函數高階用法。 1. 理解函數的基本概念 明確函數在 JavaScript 里是一段可重復使用的代碼塊&#xff0c;它能接收輸入參數&#xff0c;執行特定任務&…

AI答題pk機器人來襲

AI答題PK機器人是一種具備知識問答競賽功能的人工智能程序。以下為您詳細介紹&#xff1a; 一、實時對戰&#xff1a;能在答題排位PK升級賽中&#xff0c;與用戶進行1V1在線實時PK答題 。比如在一些知識競賽類APP中&#xff0c;用戶可匹配到AI機器人對手&#xff0c;在規定時…

PclSharp ——pcl的c#nuget包

簡介&#xff1a; NuGet Gallery | PclSharp 1.8.1.20180820-beta07 下載.NET Framework 4.5.2 Developer Pack&#xff1a; 下載 .NET Framework 4.5.2 Developer Pack Offline Installer 離線安裝nupkg&#xff1a; nupkg是visual studio 的NuGet Package的一個包文件 安…

【Unity筆記】Unity音視頻播放監聽器封裝筆記:VideoPlayer + AudioSource事件觸發與編輯器擴展

關鍵點 Unity VideoPlayer 播放結束事件Unity AudioSource 播放檢測 Unity音視頻播放監聽器封裝筆記&#xff1a;VideoPlayer AudioSource事件觸發與編輯器擴展 在 Unity 的多媒體開發中&#xff0c;我們經常需要監聽 VideoPlayer 或 AudioSource 的播放狀態&#xff0c;以便…