为工厂方法创建的对象提供依赖关系

时间:2021-03-17 16:13:26

标签: go

给定以下界面:

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 
             }
}

对于如何为 StoreADefaultStore 提供依赖关系,我有点挣扎。它们依赖于完全不同的对象,我不想将 StoreADefaultStore 的依赖项作为参数传递给 CreateStore 函数。此外,未来可能会有更多的 Store 实现。当然,我可以简单地在每个 if 分支中创建依赖项,但这不太好测试。您在 go 的这种情况下使用哪种模式?

1 个答案:

答案 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
    })
}