Golang设计模式之-单例模式
单例模式(Singleton Pattern)是一种确保一个类只有一个实例,并提供一个全局访问点来获取该实例的设计模式。在Go中实现单例模式时,通常会涉及到饿汉模式和懒汉模式
饿汉模式
package singleton
type singleton struct{}
var instance = &singleton{}
func GetInstance() *singleton {
return instance
}
在这个饿汉模式的例子中,instance
是一个包级私有变量,它在包被导入时立即初始化。GetInstance
函数提供了访问这个单例实例的全局访问点
懒汉模式
package singleton
type singleton struct{}
var instance *singleton
// 懒汉模式
func GetInstance() *singleton {
if instance == nil {
instance = &singleton{}
}
return instance
}
相较于饿汉式的实现,我们把实例化 singleton
结构体部分的代码移到了 GetInstance()
函数内部。这样一来,就将对象实例化的步骤延迟到了 GetInstance()
被第一次调用时。但是通过 instance == nil
的判断来实现单例并不十分可靠,当有多个 goroutine 同时调用 GetSingleton() 时无法保证并发安全。
支持并发的单例
package singleton
import "sync"
type singleton struct{}
var instance *singleton
var once sync.Once
// 懒汉模式
func GetInstance() *singleton {
once.Do(func() {
instance = &singleton{}
})
return instance
}
在这个懒汉模式的例子中,instance
变量在第一次调用 GetInstance
函数时才被初始化。sync.Once
的 Do
方法确保了初始化代码只会执行一次,即使在多线程环境中也是安全的