給定以下接口:type Store interface { // some methods}我計(jì)劃創(chuàng)建一個(gè)“工廠(chǎng)”,它將根據(jù)傳入的值為我提供正確的實(shí)現(xiàn):Storefunc CreateStore(envVar EnvironmentProvider) Store { if envVar == "A" { return &StoreA{ //dependencies to create a StoreA } else { return &DefaultStore { // dependencies to create a DefaultStore }}我有點(diǎn)糾結(jié)于如何為OR提供依賴(lài)項(xiàng)。它們依賴(lài)于完全不同的對(duì)象,我不想將兩者都傳遞到函數(shù)的依賴(lài)關(guān)系中,以及作為函數(shù)的參數(shù)。此外,將來(lái)可能會(huì)有更多的實(shí)施。當(dāng)然,我可以簡(jiǎn)單地在每個(gè)if分支中創(chuàng)建依賴(lài)項(xiàng),但這不適合測(cè)試。對(duì)于這種情況,您使用哪種模式?StoreADefaultStoreStoreADefaultStoreCreateStoreStorego
1 回答

炎炎設(shè)計(jì)
TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以使用注冊(cè)表模式:
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]()
}
然后,每個(gè)實(shí)現(xiàn)可以留在自己的包中,并使用以下命令注冊(cè)其工廠(chǎng):init()
package storeA
func init() {
registrypkg.Register("storetype", func() registrypkg.Store {
// create and return a new Store
})
}
- 1 回答
- 0 關(guān)注
- 89 瀏覽
添加回答
舉報(bào)
0/150
提交
取消