猿问

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

给定以下接口:


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 

             }

}

我有点纠结于如何为OR提供依赖项。它们依赖于完全不同的对象,我不想将两者都传递到函数的依赖关系中,以及作为函数的参数。此外,将来可能会有更多的实施。当然,我可以简单地在每个if分支中创建依赖项,但这不适合测试。对于这种情况,您使用哪种模式?StoreADefaultStoreStoreADefaultStoreCreateStoreStorego


暮色呼如
浏览 80回答 1
1回答

炎炎设计

您可以使用注册表模式: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 storeAfunc init() {   registrypkg.Register("storetype", func() registrypkg.Store {        // create and return a new Store    })}
随时随地看视频慕课网APP

相关分类

Go
我要回答