設計模式--單例模式(Singleton)【Go】

?引言

在設計模式中,單例模式(Singleton Pattern)是一種非常常見且實用的模式。它的核心思想是確保一個類只有一個實例,并提供一個全局訪問點。這種模式在需要全局唯一對象的場景中非常有用,比如配置管理、日志記錄、數據庫連接池等。

本文將通過一個簡單的 Go 示例,帶你理解單例模式的基本概念和實現方法。即使你是設計模式的新手,也能輕松掌握!


什么是單例模式?

單例模式是一種創建型設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取該實例。它的主要特點包括:

  1. 唯一性:整個程序中只有一個實例存在。
  2. 全局訪問:通過一個靜態方法或變量來訪問該實例。

單例模式的核心思想是通過控制類的實例化過程,避免外部代碼隨意創建多個實例。


為什么需要單例模式?

在某些場景中,我們需要確保一個類只有一個實例。例如:

  • 配置管理:程序的配置信息只需要加載一次,全局共享。
  • 日志記錄:日志系統只需要一個實例來記錄所有日志。
  • 數據庫連接池:數據庫連接池只需要一個實例來管理所有連接。

如果這些場景中允許多個實例存在,可能會導致資源浪費或數據不一致的問題。

Go實現單例模式

先從簡單的單例模式入手,通過簡單的鎖機制實現單例

package mainimport ("fmt""sync"
)// 定義單例結構體
type Singleton struct{}// 全局變量,用于存儲單例實例
var instance *Singleton
// 同步對象,確保單例實例只被創建一次
var once sync.Once// 獲取單例實例的函數
func GetInstance() *Singleton {// 使用 once.Do 確保單例實例只被創建一次once.Do(func() {// 創建單例實例instance = &Singleton{}})// 返回單例實例return instance
}// 方法,用于打印單例實例的內存地址
func (s *Singleton) PrintAddress() {fmt.Println(s)
}func main() {// 獲取單例實例singleton1 := GetInstance()// 打印單例實例的內存地址singleton1.PrintAddress()// 再次獲取單例實例singleton2 := GetInstance()// 打印單例實例的內存地址singleton2.PrintAddress()// 打印單例實例的內存地址fmt.Println("Address:", singleton1)// 打印單例實例的內存地址fmt.Println("Address:", singleton2)
}

通過這個例子,你會發現singleton1和singleton2的地址相同

如果我們想通過單例模式來創建其他類實例,需要引入模板,參考下列代碼。

假設我們需要創建一個Redis連接池,通過單例模式實現可以確保一個實例管理所有鏈接

package mainimport ("fmt""sync"
)// RedisConPool 結構體,實現單例模式
type RedisConPool struct{}// 單例實例
var instance *RedisConPool
// 用于保證線程安全的互斥鎖
var once sync.Once// GetInstance 函數,獲取單例實例
func GetInstance() *RedisConPool {once.Do(func() {// 只執行一次,創建單例實例instance = &RedisConPool{}fmt.Println("RedisConPool instance created!")})return instance
}// PrintAddress 方法,打印實例地址
func (r *RedisConPool) PrintAddress() {fmt.Printf("%p\n", r)
}func main() {// 獲取單例實例redis1 := GetInstance()redis2 := GetInstance()redis1.PrintAddress()redis2.PrintAddress()// 比較兩個單例實例fmt.Println("redis1 == redis2 ?", redis1 == redis2)
}

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

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

相關文章

MySQL數據庫復制

文章目錄 MySQL數據庫復制一、復制的原理二、復制的搭建1.編輯配置文件2.在主庫上創建復制的用戶3.獲取主庫的備份4.基于從庫的恢復5.建立主從復制6.開啟主從復制7.查看主從復制狀態 MySQL數據庫復制 MySQL作為非常流行的數據庫,支撐它如此出彩的因素主要有兩個&am…

Sourcetree——使用.gitignore忽略文件或者文件夾

一、為何需要文件忽略機制? 1.1 為什么要會略? 對于開發者而言,明智地選擇忽略某些文件類型,能帶來三大核心優勢: 倉庫純凈性:避免二進制文件、編譯產物等污染代碼庫 安全防護:防止敏感信息&…

基于yolov8+streamlit實現目標檢測系統帶漂亮登錄界面

【項目介紹】 基于YOLOv8和Streamlit實現的目標檢測系統,結合了YOLOv8先進的目標檢測能力與Streamlit快速構建交互式Web應用的優勢,為用戶提供了一個功能強大且操作簡便的目標檢測平臺。該系統不僅具備高精度的目標檢測功能,還擁有一個漂亮且…

分享vue好用的pdf 工具實測

vue3-pdf-app: 帶大綱,帶分頁,帶縮放,帶全屏,帶打印,帶下載,帶旋轉 下載依賴: yarn add vue3-pdf-appornpm install vue3-pdf-app 配置類: 創建文件 pdfConfig.ts /…

基于微信小程序開發的寵物領養平臺——代碼解讀

項目前端 一、項目的技術架構概況 一句話概括:該項目是基于微信小程序開發的寵物領養平臺,采用原生小程序框架進行用戶界面的構建,使用 wx.request 進行 API 請求,并通過 getApp() 和本地存儲來管理全局狀態和用戶信息。 一&am…

最完美的WPF無邊框設計!

常規的無邊框方法設計 常規的WPF無邊框設計方法都是通過AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome樣式來實現,但是這樣會有問題就是,窗體最大化的時候將底部任務欄給擋住了,另外最大化的時候不能拖動窗體。參考這個大佬的設計@ 若…

【區塊鏈】btc

學習視頻源鏈接: https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根據肖老師的視頻進行的筆記記錄 一、 cryptographic hash function 1.1. collision resistance抗碰撞性 : collision 指的是hash碰撞 抗碰撞性 (Collision Resistance) 是密碼…

C語言【數據結構】:時間復雜度和空間復雜度.詳解

引言 詳細介紹什么是時間復雜度和空間復雜度。 前言:為什么要學習時間復雜度和空間復雜度 算法在編寫成可執行程序后,運行時需要耗費時間資源和空間(內存)資源。因此衡量一個算法的好壞,一般是從時間和空間兩個維度來衡量的,即時…

QT:文件讀取

問題: 在文件讀取,判斷md5值時,遇到py文件讀取轉String后,再轉byte,md5前后不一致問題。 解決方法: python文件讀取要使用QTextStream,避免\t 、\r、\n的換行符跨平臺問題(window…

32單片機——LED

LED原理圖如圖所示: 代碼 DS0和DS1每過500ms一次交替閃爍,實現類似跑馬燈的效果 GPIO輸出配置步驟 (1)使能對應GPIO時鐘 STM32在使用任何外設之前,我們都要先使能其時鐘(下同)。本實驗用到…

貪心算法和遺傳算法優劣對比——c#

項目背景:某鋼管廠的鋼筋原材料為 55米,工作需要需切割 40 米(1段)、11 米(15 段)等 4 種規格 ,現用貪心算法和遺傳算法兩種算法進行計算: 第一局:{ 40, 1 }, { 11, 15…

【Java篇】一法不變,萬象歸一:方法封裝與遞歸的思想之道

文章目錄 Java 方法的使用:從基礎到遞歸的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定義1.3 方法調用的執行過程1.4 實參和形參的關系1.5 沒有返回值的方法 二、方法重載2.1 為什么需要方法重載2.2 方法重載的概念2.2.4 C 和 Java 的比較&…

深入理解 HTML 中的<div>和元素:構建網頁結構與樣式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素雖看似普通&#xff0c;卻扮演著極為關鍵的角色。它們就像網頁搭建過程中的萬能積木&#xff0c;能夠將各種 HTML 元素巧妙地組合起來&#xff0c;無論是構建頁面布局&#xff0c;還是對局部內容進行樣式調整&#xff…

《大語言模型》學習筆記(一)

一、什么是大語言模型 大語言模型是指在海量無標注文本數據上進行預訓練得到的大型預訓練語言模型&#xff0c;例如GPT-3&#xff0c;PaLM和LLaMA。大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一種基于深度學習的自然語言處理模型&#xff0c;能…

電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現

以下是電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現方案,涵蓋系統架構、關鍵技術、核心功能及實施路徑,結合典型場景與代碼示例: 一、系統架構設計 采用云-邊-端三層架構,實現分布式能源的高效協同管理: 1. 終端層(感知層) 設備組…

實驗5 邏輯回歸

實驗5 邏輯回歸 【實驗目的】掌握邏輯回歸算法 【實驗內容】處理樣本&#xff0c;使用邏輯回歸算法進行參數估計&#xff0c;并畫出分類邊界 【實驗要求】寫明實驗步驟&#xff0c;必要時補充截圖 1、參照“2.1梯度下降法實現線性邏輯回歸.ipynb”和“2.2 sklearn實現線性邏輯…

思維訓練讓你更高、更強 |【邏輯思維能力】「刷題訓練筆記」假設法模式邏輯訓練題(1-5)

每日一刷 思維訓練讓你更高、更強&#xff01; 題目1 誰在說謊&#xff0c;誰拿走了零錢&#xff1f; 姐姐上街買菜回來后&#xff0c;就隨手把手里的一些零錢放在了抽屜里&#xff0c;可是&#xff0c;等姐姐下午再去拿錢買菜的時候發現抽屜里的零錢沒有了&#xff0c;于是&…

【愚公系列】《高效使用DeepSeek》004-DeepSeek的產品形態和功能詳解

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

用python代碼將excel中的數據批量寫入Json中的某個字段,生成新的Json文件

需求 需求&#xff1a; 1.將execl文件中的A列賦值給json中的TrackId&#xff0c;B列賦值給json中的OId 要求 execl的每一行&#xff0c;對應json中的每一個OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

【Python】dash-fastapi前后端搭建

概述 項目中需要快速搭建一個前后端系統&#xff0c;涉及到dash-fastapi架構的時候&#xff0c;對該架構的時候進行總結。本文主要總結的是對該架構的基本使用&#xff0c;后續再對該架構的項目源碼進行總結分析 此處實現一個小的demo&#xff0c;迷你任務管理器&#xff0c;…