給定以下接口: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 關注
- 88 瀏覽
添加回答
舉報
0/150
提交
取消