给定以下界面:
type Store interface {
// some methods
}
我打算创建一个“工厂”,它会根据传入的值为我提供正确的 Store
实现:
func CreateStore(envVar EnvironmentProvider) Store {
if envVar == "A" {
return &StoreA{
//dependencies to create a StoreA
}
else {
return &DefaultStore {
// dependencies to create a DefaultStore
}
}
对于如何为 StoreA
或 DefaultStore
提供依赖关系,我有点挣扎。它们依赖于完全不同的对象,我不想将 StoreA
和 DefaultStore
的依赖项作为参数传递给 CreateStore
函数。此外,未来可能会有更多的 Store
实现。当然,我可以简单地在每个 if 分支中创建依赖项,但这不太好测试。您在 go
的这种情况下使用哪种模式?
答案 0 :(得分:3)
您可以使用注册表模式:
var storeRegistry=map[string]func() Store{}
func Register(name string,factory func() Store) {
storeRegistry[name]=factory
}
func CreateStore(env EnvironmentProvider) Store {
storeType:= // Determine store type from env
return storeRegistry[env.StoreType]()
}
然后,每个实现都可以保留在自己的包中,并使用 init()
注册它们的工厂:
package storeA
func init() {
registrypkg.Register("storetype", func() registrypkg.Store {
// create and return a new Store
})
}