設計模式是針對軟體設計中出現的常見問題的經過嘗試和測試的解決方案。它們提供了以靈活且可重複使用的方式解決這些問題的範本或指南。
每種模式都代表了開發人員可以適應其特定環境的最佳實踐。設計模式通常分為三大類。
為了開始這個系列,我們先來談談單例模式。
單例模式確保一個類別只有一個實例,並提供對該實例的全域存取點。
這在您需要管理共享資源(例如資料庫連線或組態設定)的情況下非常有用。
通常需要確保某個類別僅存在一個實例,例如在管理配置或與硬體資源互動時。如果沒有 Singleton,建立多個實例可能會導致資料不一致或資源鎖定等問題。
這種情況在使用非同步程式碼時很常見,其中多個 goroutine 可以建立類別的新實例或存取共享資源。
考慮資料庫連接池:如果應用程式的多個部分同時建立新連接,則最終可能會出現冗餘或衝突的資料庫互動。單例確保在整個應用程式中僅建立和使用一個連線。
package main import ( "fmt" "sync" ) type Singleton interface { DoSomething() string } type singleton struct{} var lock = &sync.Mutex{} var instance *singleton func NewSingletonInstance() *singleton { if instance == nil { lock.Lock() defer lock.Unlock() if instance == nil { fmt.Println("Creating single instance now.") instance = &singleton{} } else { fmt.Println("Single instance already created.") } } else { fmt.Println("Single instance already created.") } return instance } func (s *singleton) DoSomething() string { return "Doing something." } func main() { instance1 := NewSingletonInstance() instance2 := NewSingletonInstance() fmt.Printf("%p\n", instance1) fmt.Printf("%p\n", instance2) }
函數 NewSingletonInstance 確保僅建立一個單例實例,即使多次呼叫也是如此。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3