AI智能
改变未来

GoLang设计模式02 – 工厂模式

工厂模式是一种创建型模式,也是最常用的设计模式之一。调用方通过工厂产出并获取对象,可以不必关注对象创建的细节和构建逻辑。

在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象。工厂负责和相应的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!

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » GoLang设计模式02 – 工厂模式