design-patterns - 可能有数百个小类的工厂模式的替代方案

标签 design-patterns go factory-pattern

我正在开发一个用 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/

相关文章:

java - Selenium [Java] PageFactory 设计 : Where do I write my Assertions following Page Object Model

java - 创建同一个类的不同实例,哪种设计模式?

ruby - 什么是 Ruby 工厂方法?

design-patterns - 建厂的最佳方法

java - 创建方法与工厂方法

javascript - "site wide"ViewModel 变量的设计模式

javascript - 如何在javascript中实现观察者模式?

高语 : Memory allocation for type inheritance and casting in Go

go - 为什么 IsValid() 对 int 的零值返回 true?

go - os.FileInfo 中的 Sys() 是什么?