想请教一下Golang如何根据不同参数构建不同实例?单例模式转工厂模式
目的:需要根据不同的配置参数,连接不同的ES,应产生两个ES连接对象
目前代码是单例模式,即使传不同的参数,仍然是使用同一个对象实例。
type ES struct {
client *elastic.Client //查询ES
prefix string
}
var esHandle *ES
var esOnce sync.Once
func NewES(prefix string, user, password string, retryStrSlice, urls []string, encrypt bool) *ES {
es := &ES{}
if err := es.Init(prefix, user, password, retryStrSlice, urls, encrypt); err != nil {
panic(err)
return es
}
return es
}
func GetES(prefix string, user, password string, retryStrSlice, urls []string, encrypt bool) *ES {
esOnce.Do(func() {
esHandle = NewES(prefix, user, password, retryStrSlice, urls, encrypt)
})
return esHandle
}
别用once 用 mutex来控制
直接调用包的NewES函数不就可以解决你的问题了,没搞懂你是要干嘛
可以看一下我写的设计模式的例子:
github.com/1uvu/GoF-go
需要根据不同的配置参数,连接不同的 ES,应产生两个 ES 连接对象
你的意思应该是:既支持产生不同的 ES,又要求每个 ES 实例只有一个存在 吧
那么需要实现 abstract factory 模式,然后将 abstract factory 用于生成 ES 实例的模板方法,使用单例实现。
在项目启动的时候,根据需要,依次初始化若干个client就行了。不需要用到工厂模式。因为在项目初始化的时候,同配置的肯定不会重复创建client,且一旦配置出错,只需要panic,让项目启动不了就行,能及时发现配置错误。如果在使用到对应client的时候使用工厂模式,或者单例模式创建client,一旦创建不了,这个时候可能项目已经启动一会儿了,上一个版本的程序已经被迭代,会导致服务不可用,非常糟糕。所以应该在main 或者 init 里面,将服务内用到的各种资源都依次初始化好才是正途。不要为了设计模式而设计模式。