给定以下接口:type Store interface { // some methods}我计划创建一个“工厂”,它将根据传入的值为我提供正确的实现:Storefunc CreateStore(envVar EnvironmentProvider) Store { if envVar == "A" { return &StoreA{ //dependencies to create a StoreA } else { return &DefaultStore { // dependencies to create a DefaultStore }}我有点纠结于如何为OR提供依赖项。它们依赖于完全不同的对象,我不想将两者都传递到函数的依赖关系中,以及作为函数的参数。此外,将来可能会有更多的实施。当然,我可以简单地在每个if分支中创建依赖项,但这不适合测试。对于这种情况,您使用哪种模式?StoreADefaultStoreStoreADefaultStoreCreateStoreStorego
1 回答
炎炎设计
TA贡献1808条经验 获得超4个赞
您可以使用注册表模式:
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
})
}
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报
0/150
提交
取消