单例模式

149次阅读

共计 708 个字符,预计需要花费 2 分钟才能阅读完成。

什么是单例

单例设计模式是一种常用的设计模式,用于确保系统中的某个对象只存在一个实例,并提供一个全局访问点来访问这个实例。

那么我们要如何来保证全局只有一个实例呢?

首先我们需要防止外部 new 这个对象,然后在提供一个外部可以获取到这个对象的方法,并且在这个方法中我们需要保证外部多次调用获取到的是同一个对象。

如何防止外部实例化

在 go 语言中,我们可以通过首字母的大小写来控制结构体和方法是否能够被外部调用。

如何实现单例

在 go 语言中,我们大概可以使用两种方式来实现单例。一种是饿汉式,一种是懒汉式。

饿汉式

包加载的时候立即创建这个实例。

type singleton struct {
}

var instance *singleton = &singleton{}

func GetInstance() *singleton {return instance}

懒汉式

type singleton struct {
}

var instance *singleton

func GetInstance() *singleton {
    if instance == nil {instance = &singleton{}
    }
    return instance
}

与饿汉式相比,懒汉式将创建这个实例的时机延迟到了实际调用的时候。不过这又会带来并发问题。

这个时候我们可以使用 sync.Once 来确保实例只被创建一次。

支持并发的懒汉式

type singleton struct {
}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {once.Do(func() {instance = &singleton{}
    })
    return instance
}
正文完
 
dkp
版权声明:本站原创文章,由 dkp 2023-04-01发表,共计708字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。