函数工厂 模式
函数工厂指的是根据输入来返回相应的函数的函数, 也就是说这个函数的返回值就是一个函数。 因为它是生产函数的, 所以我们称作函数工厂
这里举一个 golang 的例子, 函数工厂可以让我们的函数更加灵活,并且很多时候可以组合出类似 io.MultiWriter 的东西
- 定义结构体
这里的重点就是 EnergyRequirement, 我们将针对这个特征来构建函数工厂
type Work struct {
// Use timestamp hash as id
// Auto generated
ID string `toml:"id"`
// Title provide overview information for work dependency reference
// NOTE: User set
Title string `toml:"title"`
// EnergyRequirement mark the suitable status for handling this work
// NOTE: User set
EnergyRequirement Energy `toml:"energy"`
// Auto generated
// default StatusTODO
Status WorkStatus `toml:"work_status"`
}
- 定义函数类型
type WorkFilter func(*models.Work) bool
这里我们定义了一个函数类型, 它的输入是一个 models.Work 的指针, 然后返回 bool 类型, 表示是否符合条件
- 实现函数工厂
函数工厂在大多数时候需要满足处理和判断的逻辑都相同
针对 EnergyRequirement 这个字段, 我们进行相同的逻辑判断, 因此我们可以实现一个工厂
func EnergyFilter (e models.Energy) WorkFilter {
return func (w *models.Work) bool {
return w.EnergyRequirement == e
}
}
我们根据需要输入对应的 Energy 就可以生成一个判断函数
但是单纯这样并不能发挥出它的作用。
真正的精髓在于将多个函数组合成一个函数
func MultiFilter(filters ...WorksFilter) WorksFilter {
return func(w *models.Work) bool {
for _, f := range filters {
if !f(w) {
return false
}
}
return true
}
}
在 golang 的标准库中, 使用接口的模式也可以实现这种组合的效果, 可以查看 golang io package 当中的 MultiWriter 函数