单例模式是23种面向对象的设计模式之一。在实际应用中,涉及到配置或资源管理的对象,都应该考虑单例模式。广义上讲,只要能够保证只执行一次类的实例化过程,就能实现单例模式。如果某段代码确实只会执行一次,那么就是一个天然的单例模式,比如python里的模块导入。而有的时候,初始化对象的函数可能要执行多次,这时就需要对类的实例化进行拦截。单例模式最基本的问题,是判断是否类已经实例化,这就需要用一个变量,来判断,比如锁,全局变量,类变量(Python), 闭包(Python)等等。
type singleton struct {}
var single *singleton
1.最简单的单例模式
// 非线程安全的单例模式
func GetInstance1() *singleton {
if single == nil {
single = &singleton{}
}
return single
}
2.线程安全的单例模式
// 线程安全的单例模式
import "sync"
var lock sync.Mutex
func GetInstance2() *singleton {
lock.Lock()
defer lock.Unlock()
if single == nil {
single = &singleton{}
}
return single
}
3.优化的线程安全单例模式
// 线程安全的单例模式,且降低锁的开销
func GetInstance3() *singleton {
if single == nil {
lock.Lock()
defer lock.Unlock()
if single == nil {
single = &singleton{}
}
}
return single
}
4. 使用sync.Once
// 使用sync.Once, 代码最优雅
var once sync.Once
func GetInstance3() *singleton {
once.Do(func(){
single = &singleton{}
})
return single
}
网友评论