golang单例模式-三种实现形式
定义
单例(Singleton)模式的定义:指⼀个类只有⼀个实例,且该类能⾃⾏创建这个实例的⼀种模式,可以看到定义简单,算是设计模式中最简单的⼀个模式了。
饿汉模式
即还未使⽤该对象时,对象已经创建完成。
⽅法是通过golang 的init函数,在导包时就⾃动执⾏。
package mian
import"fmt"
var instanse *singler
type singler struct{
Name string
}
单例模式的几种实现方式func NewSingler()*singler{
return instanse
}
func init(){
instanse =new(singler)
instanse.Name ="test"
}
func main(){
singler :=NewSingler()
fmt.Println(singler.Name)
}
懒汉模式
即⽤户需要的时候再创建,这⾥采⽤锁的模式去创建,为了减少锁的判断的次数,可以采⽤双重判断机制。在对象创建完成后,后续不需要加锁处理 。
package main
import(
"fmt"
"sync"
)
var instanse *singler
var mutex sync.Mutex
type singler struct{
Name string
}
func NewSingler()*singler {
if instanse ==nil{
mutex.Lock()
defer mutex.Unlock()
if instanse ==nil{
instanse =new(singler)
instanse.Name ="test"
}
}
return instanse
}
func main(){
singler :=NewSingler()
fmt.Println(singler.Name)
}
懒汉模式之sync.Once
在上⾯的代码中,是我们⾃⼰实现的防⽌创建多个的情况,在golang的包中有个很好⽤的⼯具sync.Once,它可以保证只执⾏⼀次。代码如下:
package main
import(
"fmt"
"sync"
)
var once sync.Once = sync.Once{}
var instanse *singler
type singler struct{
Name string
}
func NewSingler()*singler {
once.Do(func(){
instanse =new(singler)
instanse.Name ="这是⼀个单例"
})
return instanse
}
func main(){
singler :=NewSingler()
fmt.Println(singler.Name)
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论