Skip to main content

工厂模式

特点

在 Go 中,工厂模式是一种创建型设计模式,主要特点包括:

  1. 封装创建逻辑: 将对象创建过程封装在工厂函数中,简化客户端代码。
  2. 提高灵活性: 工厂函数可以根据输入参数返回不同类型或配置的对象。
  3. 隐藏复杂性: 客户端无需了解对象创建的细节。
  4. 易于扩展: 修改工厂函数即可扩展或更改对象创建逻辑。
  5. 使用接口: 通常返回接口类型,提高抽象性和实现的可替换性。

这种模式适用于需要动态创建对象或对象创建过程复杂的场景。

代码结构清晰

为了让你的 Go 代码更清晰,可以考虑以下几点:

  1. 分文件管理:

    • 将不同的类型和逻辑分成多个文件。例如,可以将接口和通用结构体放在一个文件中,具体的枪支实现放在各自的文件中。
  2. 命名清晰:

    • 确保函数和变量命名清晰且具有描述性,这样可以提高代码的可读性。
  3. 错误处理:

    • 在获取枪支时处理错误,而不是忽略它们。即使在示例代码中,也应展示良好的错误处理实践。
  4. 注释:

    • 为每个导出的函数和结构体添加注释,解释其目的和用法。
  5. 代码格式化:

    • 使用 go fmt 工具自动格式化代码,确保一致的代码风格。

以下是改进后的代码示例:

package main

import (
"fmt"
)

// iGun 接口定义了枪支的基本行为
type iGun interface {
setName(name string)
setPower(power int)
getName() string
getPower() int
}

// gun 结构体实现了 iGun 接口的基本方法
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 结构体嵌入 gun,实现 iGun 接口
type ak47 struct {
gun
}

// newAk47 创建并返回一个 ak47 实例
func newAk47() iGun {
return &ak47{
gun: gun{
name: "AK47 gun",
power: 4,
},
}
}

// maverick 结构体嵌入 gun,实现 iGun 接口
type maverick struct {
gun
}

// newMaverick 创建并返回一个 maverick 实例
func newMaverick() iGun {
return &maverick{
gun: gun{
name: "Maverick gun",
power: 5,
},
}
}

// getGun 根据类型返回相应的枪支实例
func getGun(gunType string) (iGun, error) {
switch gunType {
case "ak47":
return newAk47(), nil
case "maverick":
return newMaverick(), nil
default:
return nil, fmt.Errorf("wrong gun type passed")
}
}

func main() {
ak47, err := getGun("ak47")
if err != nil {
fmt.Println(err)
return
}
maverick, err := getGun("maverick")
if err != nil {
fmt.Println(err)
return
}
printDetails(ak47)
printDetails(maverick)
}

// printDetails 打印枪支的详细信息
func printDetails(g iGun) {
fmt.Printf("Gun: %s\n", g.getName())
fmt.Printf("Power: %d\n", g.getPower())
}

通过这些改进,你的代码将更易于维护和理解。

这个结构清晰

https://golangbyexample.com/golang-factory-design-pattern/