您的位置:首页 > 编程语言 > Go语言

GoLang设计模式02 - 工厂模式

2021-09-05 22:44 1176 查看

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

在工厂模式下,调用方只和工厂进行交互,并告诉工厂具体获取哪种类型的对象。工厂负责和相应的struct交互,并返回需要的对象。

如下是工厂模式的UML类图:

接下来是一个工厂模式的范例,在这个例子中:

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

这里是这个例子对应的类图:

具体代码如下:

iGun.go

package main

type iGun interface {
setName(name string)
setPower(power int)
getName() string
getPower() int
}

gun.go

package main

type gun struct {
name  string
power 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 main

type ak47 struct {
gun
}

func newAk47() iGun {
return &ak47{
gun: gun{
name:  "AK47 gun",
power: 4,
},
}
}

maverick.go

package main

type maverick struct {
gun
}

func newMaverick() iGun {
return &maverick{
gun: gun{
name:  "Maverick gun",
power: 5,
},
}
}

gunFactory.go

package main

import "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 main

import "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!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: