我正在开发一个用 GoLang 编写的小型游戏/模拟器,其中可能有数百种能力。对于每个玩家,他们将拥有 1 到 3 种能力。我会将这些与字符串或 ID 一起存储。实例化这些能力的最佳方式是什么。通常我会使用工厂类,但鉴于我所说的那么多,我不确定这是最好的方法。
最佳答案
你仍然可以使用工厂模式,这就是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()
}
}
关于design-patterns - 可能有数百个小类的工厂模式的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24132594/