建立型:一. 單例模式
阿新 • • 發佈:2022-03-16
單例模式是什麼
單例模式是一種建立型設計模式:單例模式保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點。
為什麼要用單例模式
為什麼要用單例模式?在系統中某些物件,我們只需要一個全域性的,如果每次例項化會浪費資源。所以單例模式可以節約記憶體,加快物件訪問速度,因此單例模式在某些場合適合使用。比如多個模組使用同一個資料來源連線物件;比如配置資料可以由一個單例物件統一讀取;還有比如日誌檔案的物件也可以用單例模式。
單例模式怎麼實現
我們可以用一個私有的全域性變數來儲存一個物件,並且提供一個獲取物件的方法,在這個方法裡面來實現只建立一次。但是要注意多執行緒的情況,如果多個執行緒同時訪問,也要保證只建立一個物件。這裡我們可以用golang的原子操作來實現。
package singleton import "sync" // Singleton 是單例模式介面 // 通過該介面可以避免 GetInstance 返回一個包私有型別的指標 type Singleton interface { foo() } type singleton struct{} func (s singleton) foo() {} var ( instance *singleton once sync.Once ) //GetInstance 用於獲取單例模式物件 func GetInstance() Singleton { once.Do(func() { instance = &singleton{} }) return instance }
優點
- 為整個系統提供一個全域性的訪問點,利於管理。
- 全域性只有一個該物件,節約記憶體。
- 避免了頻繁的建立銷燬,提示效能。
缺點
- 不適用於變化的物件,如果同一型別的物件總是要在不同的用例場景發生變化,單例就會引起資料的錯誤。
- 由於單利模式中沒有抽象層,因此單例類的擴充套件有很大的困難。