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