阅读 102

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

1
2
3
4
5
6
7
8
package main
 
type iGun interface {
    setName(name string)
    setPower(power int)
    getName() string
    getPower() int
}

gun.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
 
type ak47 struct {
    gun
}
 
func newAk47() iGun {
    return &ak47{
        gun: gun{
            name:  "AK47 gun",
            power: 4,
        },
    }
}

maverick.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
 
type maverick struct {
    gun
}
 
func newMaverick() iGun {
    return &maverick{
        gun: gun{
            name:  "Maverick gun",
            power: 5,
        },
    }
}

gunFactory.go

1
2
3
4
5
6
7
8
9
10
11
12
13
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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!

服务器评测 http://www.cncsto.com/ 

服务器测评 http://www.cncsto.com/ 

站长资源 https://www.cscnn.com/ 

小鱼创业 https://www.237fa.com/ 


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐