想请教一下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
}
讨论数量: 4

别用once 用 mutex来控制

2年前 评论

直接调用包的NewES函数不就可以解决你的问题了,没搞懂你是要干嘛

2年前 评论

可以看一下我写的设计模式的例子:
github.com/1uvu/GoF-go

需要根据不同的配置参数,连接不同的 ES,应产生两个 ES 连接对象

你的意思应该是:既支持产生不同的 ES,又要求每个 ES 实例只有一个存在 吧

那么需要实现 abstract factory 模式,然后将 abstract factory 用于生成 ES 实例的模板方法,使用单例实现。

2年前 评论

在项目启动的时候,根据需要,依次初始化若干个client就行了。不需要用到工厂模式。因为在项目初始化的时候,同配置的肯定不会重复创建client,且一旦配置出错,只需要panic,让项目启动不了就行,能及时发现配置错误。如果在使用到对应client的时候使用工厂模式,或者单例模式创建client,一旦创建不了,这个时候可能项目已经启动一会儿了,上一个版本的程序已经被迭代,会导致服务不可用,非常糟糕。所以应该在main 或者 init 里面,将服务内用到的各种资源都依次初始化好才是正途。不要为了设计模式而设计模式。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!