工厂模式是创建型模式之一,经典的工厂方法模式是在父类中提供一个创建对象的方法,允许子类决定实例化的对象。由于go中缺少OOP的相关特性,所以只能实现该模式的基础版----简单工厂模式。
实现
假设有json,toml两种配置文件,以解析不同格式配置文件的方法实现如下:
定义解析的接口
package main
type IParse interface {
parseCfgfile()
}
解析器实现接口
package main
type parser struct {
name string
}
func (y *parser) parseCfgfile() {
println(y.name, "parse .... ")
}
- json 解析器
package main
type jsonParser struct {
parser
}
func newJsonParser() IParse {
return &jsonParser{
parser: parser{
name: "json",
},
}
}
- toml 解析器
package main
type tomlParser struct {
parser
}
func NewTomlParser() IParse {
return &tomlParser{
parser: parser{
name: "toml",
},
}
}
客户端调用
package main
// 简单的工厂
func sFactory(t int) IParse {
var obj IParse
switch t {
case 1:
obj = newJsonParser()
case 2:
obj = NewTomlParser()
default:
println("类型错误")
}
return obj
}
// 客户端调用
func client() {
parser := sFactory(1)
parser.parseCfgfile()
}
总结
当在不同条件下,由不同的方式去实现一个任务时(创建不同的类示例),可以使用工厂模式。由于创建类的代码和使用类的代码分离,符合单一职责和开闭原则,代码扩展性高。