单例模式规定,一个类只能实例化一个实例。因此单例模的特点是:
单例模式的主要使用场景有以下两个方面:
type singleton struct{}
var ins *singleton
func GetIns() *singleton{
if ins == nil {
ins = &singleton{}
}
return ins
}
缺点:非协程安全。当正在创建时,有协程来访问此时ins = nil就会再创建,单例类就会有多个实例了。
type singleton struct{}
var ins *singleton = &singleton{}
func GetIns() *singleton{
return ins
}
缺点:如果singleton创建初始化比较复杂耗时时,加载时间会延长。
type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
mu.Lock()
defer mu.Unlock()
if ins == nil {
ins = &singleton{}
}
return ins
}
缺点:虽然解决并发的问题,但每次加锁是要付出代价的
type singleton struct{}
var ins *singleton
var mu sync.Mutex
func GetIns() *singleton{
if ins == nil {
mu.Lock()
defer mu.Unlock()
if ins == nil {
ins = &singleton{}
}
}
return ins
}
type singleton struct{}
var ins *singleton
var once sync.Once
func GetIns() *singleton {
once.Do(func(){
ins = &singleton{}
})
return ins
}
优点:
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
参考资料:
Go语言单利模式
https://studygolang.com/articles/30897
Golang设计模式-单例模式
https://blog.csdn.net/qq_35703848/article/details/103561987