Golang - Design Pattern #1: 單例模式 (Singleton)

更新於 2023/08/22閱讀時間約 3 分鐘

哈囉!繼續我們的Go設計模式之旅,今天我們要探討的是「單例模式」。可能你已經聽過它,也可能還沒。但不用擔心,我們會從基礎解釋開始!


簡介

什麼是單例模式 (Singleton)

單例模式是一種確保某個類只有一個實例,並提供一個全域的訪問點來獲取這個實例的設計模式。簡單來說,它確保了在整個應用中,某個特定的類別只被實例化一次。


為什麼要用單例模式?

想像你有一個配置管理器或是連接池,你不希望這些資源在系統中被重複建立,否則可能導致資源浪費或不一致的行為。在這些場合,單例模式就派上用場了!


實務應用:設定管理器

在許多應用中,我們都需要一個管理器來持有和管理全局的設定。這些設定可能來自於一個配置文件或環境變數,而且我們不想在整個應用程序中多次加載或解析它。這時候,單例模式就非常適用了。


設定結構

type AppConfig struct {
DatabaseURL string
APIKey string
// ... 其他設定欄位
}


單例實現

package config

import (
"sync"
"os"
)

type AppConfig struct {
DatabaseURL string
APIKey string
// ... 其他設定欄位
}

var instance *AppConfig
var once sync.Once

func GetConfig() *AppConfig {
once.Do(func() {
instance = &AppConfig{
DatabaseURL: os.Getenv("DATABASE_URL"),
APIKey: os.Getenv("API_KEY"),
// ... 加載其他設定
}
})
return instance
}


使用方式

在應用的任何地方,只需要呼叫config.GetConfig()即可取得設定。無論呼叫多少次,都是同一份設定,且設定只在第一次被加載。

package main

import (
"fmt"
"your_path/config"
)

func main() {
cfg := config.GetConfig()
fmt.Println(cfg.DatabaseURL)
}

這樣,你就有了一個單例設定管理器,不需要在每次需要設定時重新加載或解析,而且可以確保整個應用程序中的設定是一致的。

此實例展示了單例模式在實務中的一個常見應用,當然還有其他情境也適合使用單例模式,如連接池日誌管理器等。


結語

單例模式提供了一種很好的方式來保證在整個應用生命週期中,某個類別只有一個實例。而Go語言提供的sync.Once讓這一切變得簡單又安全。

下次,我們會繼續探索更多有趣的設計模式。希望你今天學到了些什麼,並期待你在Go的開發旅程中能夠運用所學!🚀

avatar-img
31會員
194內容數
歡迎來到【代碼的詩情】:探索程式語言之美 系列,這是一場優雅的程式之旅,透過詩歌的抒發,尋找不同程式語言的美感和精髓。 在這個系列中,我們將透過文字的韻律,深入探索多種程式語言的核心概念和語法,以及它們獨特的應用和技巧。每一篇詩歌都是一個故事,每一段代碼都是一句詩句,讓代碼的旋律和詩情在其中相互交織。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科