工厂模式是一种创建型模式,也是最常用的设计模式之一。调用方通过工厂产出并获取对象,可以不必关注对象创建的细节和构建逻辑。
在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象。工厂负责和相应的struct交互,并返回需要的对象。
如下是工厂模式的UML类图:

接下来是一个工厂模式的范例,在这个例子中:
- 提供了一个接口
iGun ,定义了一把枪应该有的各种方法 
- 提供了一个名为
gun 的类,并实现了 iGun 接口 
- 两个具体类
ak47 和 maverick (卡宾枪,一种突击步枪),两者都组装了 gun struct,实现了 iGun 的的各种方法,因此它们也可以说是 iGun 的子类, 
- 核心是名为
gunFactory 的struct,它可以产出 ak47 和 maverick 的实例。 
- 最后,是
main.go 文件及其中的 main() 方法,可以被视为是调用方,它依赖了 gunFactory 来创建 ak47 和 maverick 的实例,并应用这两个实例。 
这里是这个例子对应的类图:

具体代码如下:
iGun.go
package maintype iGun interface {setName(name string)setPower(power int)getName() stringgetPower() int}
gun.go
package maintype gun struct {name  stringpower int}func (g *gun) setName(name string) {g.name = name}func (g *gun) getName() string {return g.name}func (g *gun) setPower(power int) {g.power = power}func (g *gun) getPower() int {return g.power}
ak47.go
package maintype ak47 struct {gun}func newAk47() iGun {return &ak47{gun: gun{name:  \"AK47 gun\",power: 4,},}}
maverick.go
package maintype maverick struct {gun}func newMaverick() iGun {return &maverick{gun: gun{name:  \"Maverick gun\",power: 5,},}}
gunFactory.go
package mainimport \"fmt\"func getGun(gunType string) (iGun, error) {if gunType == \"ak47\" {return newAk47(), nil}if gunType == \"maverick\" {return newMaverick(), nil}return nil, fmt.Errorf(\"Wrong gun type passed\")}
main.go
package mainimport \"fmt\"func main() {ak47, _ := getGun(\"ak47\")maverick, _ := getGun(\"maverick\")printDetails(ak47)printDetails(maverick)}func printDetails(g iGun) {fmt.Printf(\"Gun: %s\", g.getName())fmt.Println()fmt.Printf(\"Power: %d\", g.getPower())fmt.Println()}
代码已上传至GitHub:zhyea / go-patterns / factory-pattern
End!
 爱站程序员基地
爱站程序员基地


