哈囉!繼續我們的Go設計模式之旅,今天我們要探討的是「單例模式」。可能你已經聽過它,也可能還沒。但不用擔心,我們會從基礎解釋開始!
單例模式是一種確保某個類只有一個實例,並提供一個全域的訪問點來獲取這個實例的設計模式。簡單來說,它確保了在整個應用中,某個特定的類別只被實例化一次。
想像你有一個配置管理器或是連接池,你不希望這些資源在系統中被重複建立,否則可能導致資源浪費或不一致的行為。在這些場合,單例模式就派上用場了!
在許多應用中,我們都需要一個管理器來持有和管理全局的設定。這些設定可能來自於一個配置文件或環境變數,而且我們不想在整個應用程序中多次加載或解析它。這時候,單例模式就非常適用了。
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的開發旅程中能夠運用所學!🚀