设计模式之单例模式
Table of Contents
单例模式是确保对象只初始化一次的编码模式,常用于全局资源的创建。
实现单例模式 #
在其他语言(如java)中,可能需要双重锁检查的方式来实现单例模式,但是在go中直接使用sync.Once即可:
package singleton
import "sync"
var (
once sync.Once
globalResource *resource
)
type resource struct {}
func GetResource() *resource {
once.Do(func() {
globalResource = new(resource)
})
return globalResource
}
避免使用单例模式 #
单例模式最需要人们关心的其实并不是如何实现,而是如何避免使用。
在《游戏编程模式》中总结了如下理由:
- **单例模式所创建的对象可以看做是全局变量,而全局变量增加了代码的复杂度。**假如我们在查bug,我们理应只需关注这个方法内的逻辑,而不应把精力花费在全局变量上。
- **全局变量造成了耦合。**由于任何地方都能进行引用,那么开发者就会在一切地方引用。所以这块代码将难以维护——因为没人能修改全局的代码并且确保它不会出错。
- **对并发不友好。**这显而易见。