替代工厂模式可能有数百个小类

时间:2014-06-10 03:57:11

标签: design-patterns go factory-pattern

我正在开发一个用GoLang编写的小型游戏/模拟器,其中可能有数百种能力。对于每个玩家,他们将拥有1到3个技能。我将这些存储与字符串或ID。实例化这些能力的最佳方法是什么。通常情况下我会使用一个工厂级,但是和我说的一样多,我不确定这是最好的方式。

1 个答案:

答案 0 :(得分:6)

您仍然可以使用工厂模式,这是encoding/gob包使用的模式。

playground:http://play.golang.org/p/LjR4PTTCvw

例如在abilities.go中你可以拥有

type Ability interface {
    Execute()
}

var abilities = struct {
    m map[string]AbilityCtor
    sync.RWMutex
}{m: make(map[string]AbilityCtor)}

type AbilityCtor func() Ability

func Register(id string, newfunc AbilityCtor) {
    abilities.Lock()
    abilities.m[id] = newfunc
    abilities.Unlock()
}

func GetAbility(id string) (a Ability) {
    abilities.RLock()
    ctor, ok := abilities.m[id]
    abilities.RUnlock()
    if ok {
        a = ctor()
    }
    return
}

然后对于每种能力(可能在单独的文件中),您可以执行以下操作:

type Fireball struct{}

func (s *Fireball) Execute() {
    fmt.Println("FIREBALL EXECUTED")
}

func init() {
    Register("Fireball", func() Ability {
        return &Fireball{}
    })
}

func main() {
    if fireball := GetAbility("Fireball"); fireball != nil { //could be nil if not found
        fireball.Execute()
    }
}