如何在Golang中实现工厂模式

来源:站长查询作者:闲进程头衔:程序员
导读:本期聚焦于小伙伴创作的《如何在Golang中实现工厂模式》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在Golang中实现工厂模式》有用,将其分享出去将是对创作者最好的鼓励。

工厂模式属于创建型设计模式,核心思想是将对象的创建逻辑封装起来,让调用方不需要直接依赖具体对象的构造过程,降低代码耦合度。在Golang中,由于不支持传统的面向对象类继承,我们可以通过接口定义统一的行为,再结合结构体实现具体逻辑,完成工厂模式的落地。

如何在Golang中实现工厂模式

简单工厂模式实现

简单工厂模式通过一个工厂函数,根据传入的参数返回不同的对象实例,适合对象类型较少且创建逻辑不复杂的场景。

首先定义一个统一的接口,所有具体产品都实现这个接口:

// 定义产品接口
type Product interface {
    Use() string
}

// 具体产品A
type ProductA struct{}

func (p *ProductA) Use() string {
    return "使用产品A"
}

// 具体产品B
type ProductB struct{}

func (p *ProductB) Use() string {
    return "使用产品B"
}

接下来实现工厂函数,根据传入的类型参数返回对应的产品实例:

// 简单工厂函数
func SimpleFactory(productType string) (Product, error) {
    switch productType {
    case "A":
        return &ProductA{}, nil
    case "B":
        return &ProductB{}, nil
    default:
        return nil, fmt.Errorf("不支持的产品类型")
    }
}

调用方只需要传入对应的类型参数,不需要关心具体产品的构造细节:

func main() {
    product, err := SimpleFactory("A")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(product.Use())
}

工厂方法模式实现

简单工厂模式的问题是如果需要新增产品类型,需要修改工厂函数的逻辑,违反了开闭原则。工厂方法模式将工厂的创建逻辑下沉到每个具体工厂,每个具体工厂只负责创建对应的产品,新增产品时只需要新增对应的工厂即可。

首先定义抽象工厂接口:

// 抽象工厂接口
type Factory interface {
    CreateProduct() Product
}

然后为每个产品实现对应的具体工厂:

// 产品A的工厂
type FactoryA struct{}

func (f *FactoryA) CreateProduct() Product {
    return &ProductA{}
}

// 产品B的工厂
type FactoryB struct{}

func (f *FactoryB) CreateProduct() Product {
    return &ProductB{}
}

调用方通过对应的工厂实例获取产品:

func main() {
    var factory Factory
    factory = &FactoryA{}
    product := factory.CreateProduct()
    fmt.Println(product.Use())
}

抽象工厂模式实现

抽象工厂模式用于创建一组相关的产品族,比如不同品牌的手机和对应的充电器,每个工厂可以生产该品牌下的所有相关产品。

首先定义两个产品接口,代表不同的产品类型:

// 手机产品接口
type Phone interface {
    Call() string
}

// 充电器产品接口
type Charger interface {
    Charge() string
}

实现不同品牌的具体产品:

// 品牌X的手机
type PhoneX struct{}

func (p *PhoneX) Call() string {
    return "品牌X手机打电话"
}

// 品牌X的充电器
type ChargerX struct{}

func (p *ChargerX) Charge() string {
    return "品牌X充电器充电"
}

// 品牌Y的手机
type PhoneY struct{}

func (p *PhoneY) Call() string {
    return "品牌Y手机打电话"
}

// 品牌Y的充电器
type ChargerY struct{}

func (p *ChargerY) Charge() string {
    return "品牌Y充电器充电"
}

定义抽象工厂接口,包含创建所有产品族的方法:

// 抽象工厂接口
type AbstractFactory interface {
    CreatePhone() Phone
    CreateCharger() Charger
}

实现每个品牌的具体工厂:

// 品牌X的工厂
type FactoryX struct{}

func (f *FactoryX) CreatePhone() Phone {
    return &PhoneX{}
}

func (f *FactoryX) CreateCharger() Charger {
    return &ChargerX{}
}

// 品牌Y的工厂
type FactoryY struct{}

func (f *FactoryY) CreatePhone() Phone {
    return &PhoneY{}
}

func (f *FactoryY) CreateCharger() Charger {
    return &ChargerY{}
}

调用方通过具体工厂获取同一品牌的所有产品:

func main() {
    var factory AbstractFactory
    factory = &FactoryX{}
    phone := factory.CreatePhone()
    charger := factory.CreateCharger()
    fmt.Println(phone.Call())
    fmt.Println(charger.Charge())
}

不同工厂模式的选择建议

三种工厂模式各有适用场景,开发者可以根据实际需求选择:

  • 简单工厂模式适合产品类型少、创建逻辑简单的场景,实现成本低,但是扩展性较差
  • 工厂方法模式适合产品类型较多,需要频繁扩展新产品的场景,符合开闭原则,但是会增加类的数量
  • 抽象工厂模式适合需要创建一组相关产品的场景,比如不同数据库的连接对象和查询对象,但是扩展新的产品族比较麻烦

在实际Golang开发中,不需要生硬套用设计模式,应该根据业务复杂度和后续扩展需求选择合适的实现方式,避免过度设计。

Golang工厂模式对象创建设计模式修改时间:2026-07-07 19:45:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。