为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
暮色呼如 2022-08-15 19:27:08
给定以下接口: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

    })

}


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信