2023-08-22|閱讀時間 ‧ 約 4 分鐘

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

哈囉!繼續我們的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的開發旅程中能夠運用所學!🚀

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.