保证一个类只有一个实例,并提供一个访问该实例的全局节点。
type Single struct {}
var Instance *Single
func GetInstance() *Single{
if Instance == nil{
createInstance()
return Instance
}
return Instance
}
func createInstance(){
Instance = &Single{}
}
GetInstance 函数返回单例类对象。
单例的构造函数必须对客户端代码隐藏。 调用获取实例方法必须是获取单例对象的唯一方式。
适用场景
- 如果程序中的某个类对于所有客户端只有一个可用的实例,可以使用单例模式。
优点
- 可以保证一个类只有一个实例。
- 获得了一个指向该实例的全局访问节点。
- 仅在首次请求单例对象时对其进行初始化。
缺点
- 在多线程环境下需要进行特殊处理,避免多个线程多次创建单例对象。
解决:用sync包的Once结构体控制生成结构体的方式只在第一次执行
import "sync"
var one sync.Once
func getInstance() *Single {
if Instance == nil {
one.Do(func() {
Instance = &Single{}
})
}
return Instance
}