wiki百科: 单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
注意:
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例。
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
懒汉模式:
type SingleObject struct {
Count int
}
var singleObj *SingleObject
func GetInstance1() *SingleObject {
if singleObj == nil {
singleObj = new(SingleObject)
}
return singleObj
}
instancenil
测试代码:
func testSingleton() {
s1 := SingletonPattern.GetInstance1()
s1.Count = 5
fmt.Println(s1)
s2 := SingletonPattern.GetInstance1()
fmt.Println(s2)
}
饿汉模式:
var singleObj *SingleObject
func init() {
singleObj = new(SingleObject)
}
func GetInstance2() *SingleObject {
return singleObj
}
饿汉模式将在包加载的时候就创建单例对象,当程序中用不到该对象时,浪费了一部分空间
和懒汉模式相比,更安全,但是会减慢程序启动速度,所以我们可以在进一步修改程序
双重检查机制:
var lock *sync.Mutex = &sync.Mutex{}
func GetInstance3() *SingleObject {
if singleObj == nil {
lock.Lock()
defer lock.Unlock()
singleObj = new(SingleObject)
}
return singleObj
}
不过对于单例模式来说Golang在标准包中已经有了更好的解决方法Sync.Once: