GoLang设计模式02 - 简单工厂模式

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

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

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

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

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

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

具体代码如下:

 1 package main
 2  
 3 type iGun interface {
 4     setName(name string)
 5     setPower(power int)
 6     getName() string
 7     getPower() int
 8 }
 9 
10 type gun struct {
11     name  string
12     power int
13 }
14  
15 func (g *gun) setName(name string) {
16     g.name = name
17 }
18  
19 func (g *gun) getName() string {
20     return g.name
21 }
22  
23 func (g *gun) setPower(power int) {
24     g.power = power
25 }
26  
27 func (g *gun) getPower() int {
28     return g.power
29 }
30 
31 type ak47 struct {
32     gun
33 }
34  
35 func newAk47() iGun {
36     return &ak47{
37         gun: gun{
38             name:  "AK47 gun",
39             power: 4,
40         },
41     }
42 }
43 
44 type maverick struct {
45     gun
46 }
47  
48 func newMaverick() iGun {
49     return &maverick{
50         gun: gun{
51             name:  "Maverick gun",
52             power: 5,
53         },
54     }
55 }
56 
57 //不符合开闭原则(对修改关闭,对扩展开放)
58 func getGun(gunType string) (iGun, error) {
59     if gunType == "ak47" {
60         return newAk47(), nil
61     }
62     if gunType == "maverick" {
63         return newMaverick(), nil
64     }
65     return nil, fmt.Errorf("Wrong gun type passed")
66 }
67 
68 func main() {
69     ak47, _ := getGun("ak47")
70     maverick, _ := getGun("maverick")
71     printDetails(ak47)
72     printDetails(maverick)
73 }
74  
75 func printDetails(g iGun) {
76     fmt.Printf("Gun: %s", g.getName())
77     fmt.Println()
78     fmt.Printf("Power: %d", g.getPower())
79     fmt.Println()
80 }

 

 

posted @ 2023-04-20 17:21  格局打得开  阅读(78)  评论(0)    收藏  举报