简述
单例模式(Singleton Pattern)是最简单的设计模式之一。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
应用
通常应用于共享的实例,比如线程池、全局缓存、对象池等。
实现
- 限制调用者直接实例化对象,对于java的做法是将构建函数设置为private,在go语言上面没有构建方法,通过利用package的访问规则来实现,定义struct的名字为小写字母开头,仅限本package内可以访问。
- 为该对象的单例提供一个全局唯一的访问方法,对于java的做法是定义通过static修饰的创建实例的方法供调用,在go语言上面同样也是利用package的访问规则来实现,定义首字母大写的函数供外部调用创建实例
示例
定义单例模式 struct
非线程安全
package singleton
// 定义只有当前包可以访问的 struct
type singletonPattern struct {
msg string
}
// 对struct对象进行实例化
var patten = &singletonPattern{msg: "单例模式"}
// 对外暴露实例化的构造函数
func Instance() *singletonPattern {
return patten
}
// 提供相关的访问方法
func (s *singletonPattern) GetMsg() string {
return patten.msg
}
线程安全
package singleton
import "sync"
// 定义只有当前包可以访问的 struct
type singletonPattern struct {
msg string
}
// 定义全局struct对象
var patten *singletonPattern
// Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,例如初始化配置、保持数据库连接等
var once = sync.Once{}
// 对外暴露实例化的构造函数
func Instance() *singletonPattern {
once.Do(func() {
patten = &singletonPattern{msg: "单例模式"}
})
return patten
}
// 提供相关的访问方法
func (s *singletonPattern) GetMsg() string {
return patten.msg
}
引用单例模式
package main
import "github.com/design/pattern/singleton"
func main() {
singleton.Instance().GetMsg()
}