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

接下来是一个工厂模式的范例,在这个例子中:
- 提供了一个接口
iGun,定义了一把枪应该有的各种方法 - 提供了一个名为
gun的类,并实现了iGun接口 - 两个具体类
ak47和maverick(卡宾枪,一种突击步枪),两者都组装了gunstruct,实现了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 }
浙公网安备 33010602011771号