• Go 语言 设计模式-工厂模式


    在这里插入图片描述

    由于 Go 中缺少类和继承等 OOP 特性, 所以无法使用 Go 来实现经典的工厂方法模式。 不过, 我们仍然能实现模式的基础版本, 即简单工厂。

    在本例中, 我们将使用工厂结构体来构建多种类型的武器。

    首先, 我们来创建一个名为 i­Gun的接口, 其中将定义一支枪所需具备的所有方法。 然后是实现了 iGun 接口的 gun枪支结构体类型。
    两种具体的枪支——ak47与 mus­ket火枪 ——两者都嵌入了枪支结构体, 且间接实现了所有的 i­Gun方法。

    gun­Fac­to­ry枪支工厂结构体将发挥工厂的作用, 即通过传入参数构建所需类型的枪支。 main.go 则扮演着客户端的角色。 其不会直接与
    ak47或 mus­ket进行互动, 而是依靠 gun­Fac­to­ry来创建多种枪支的实例, 仅使用字符参数来控制生产。

    iGun.go: 产品接口

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

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

    ak47.go: 具体产品

    package main
    type Ak47 struct {
    	Gun
    }
    func newAk47() IGun {
    	return &Ak47{
    		Gun: Gun{
    			name:  "AK47 gun",
    			power: 4,
    		},
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    musket.go: 具体产品

    package main
    type musket struct {
    	Gun
    }
    func newMusket() IGun {
    	return &musket{
    		Gun: Gun{
    			name:  "Musket gun",
    			power: 1,
    		},
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    gunFactory.go: 工厂

    package main
    import "fmt"
    func getGun(gunType string) (IGun, error) {
    	if gunType == "ak47" {
    		return newAk47(), nil
    	}
    	if gunType == "musket" {
    		return newMusket(), nil
    	}
    	return nil, fmt.Errorf("Wrong gun type passed")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    main.go: 客户端代码

    package main
    import "fmt"
    func main() {
    	ak47, _ := getGun("ak47")
    	musket, _ := getGun("musket")
    	printDetails(ak47)
    	printDetails(musket)
    }
    func printDetails(g IGun) {
    	fmt.Printf("Gun: %s", g.getName())
    	fmt.Println()
    	fmt.Printf("Power: %d", g.getPower())
    	fmt.Println()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    output.txt: 执行结果

    Gun: AK47 gun
    Power: 4
    Gun: Musket gun
    Power: 1
    
    • 1
    • 2
    • 3
    • 4

    资料来源: Go 工厂方法模式讲解和代码示例

  • 相关阅读:
    C语言飞机订票系统
    vant_vant引入
    zipkin2.24.2源码install遇见的问题
    基于simulink的模糊PID控制器设计与仿真
    Python pip更换清华源镜像
    微服务高频热点面试题汇总
    Open3D(C++) 计算三角形的有向面积
    【Python学习笔记】Optuna + Transformer B站视频实践
    ant design vue 的getPopupContainer
    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II,54. 螺旋矩阵
  • 原文地址:https://blog.csdn.net/weixin_43064185/article/details/126827853