工厂模式在Go中通过函数返回具体类型并结合接口抽象行为实现解耦,核心是用工厂函数封装new操作、对外暴露接口、隐藏具体类型,支持配置驱动、选项模式和依赖注入以提升灵活性与可测性。

工厂模式在 Go 中不是靠接口继承实现的,而是通过函数返回具体类型、结合接口抽象行为,达到解耦创建逻辑与使用逻辑的目的。核心在于:用一个函数(或结构体方法)封装 new 操作,对外只暴露接口,隐藏具体类型。
用函数工厂替代直接 new
避免在业务代码中直接调用 &ConcreteType{...}。把对象创建逻辑集中到一个函数里,该函数返回统一接口:
- 定义接口描述能力,比如
type PaymentProcessor interface { Process(amount float64) error } - 实现多个具体类型:
AlipayProcessor、WechatProcessor、CreditCardProcessor - 编写工厂函数:
func NewPaymentProcessor(kind string) PaymentProcessor,内部根据kind返回对应实例
支持配置驱动的动态创建
工厂可接收配置(如 JSON、map 或结构体),按参数决定实例化哪个类型,便于运行时切换:
- 传入
config := map[string]interface{}{"type": "alipay", "app_id": "xxx"} - 工厂解析配置,校验必要字段,再构造对应对象
- 后续新增支付方式(如 PayPal),只需增加实现 + 修改工厂分支,不改动调用方
用选项模式增强工厂灵活性
当构造参数变多或有可选配置时,避免长参数列表。采用函数式选项(Functional Options):
立即学习“go语言免费学习笔记(深入)”;
- 定义类型
type Option func(*Client) - 提供预设选项函数:
WithTimeout(30 * time.Second)、WithRetry(3) - 工厂函数签名变为
func NewClient(opts ...Option) *Client,内部按需应用选项
结合依赖注入容器进一步解耦
大型项目中,可将工厂注册到 DI 容器(如 Wire、Dig),由容器管理生命周期和依赖关系:
- 声明
func providePaymentProcessor(cfg Config) PaymentProcessor - Wire 在编译期生成初始化代码,自动注入依赖(如 logger、http client)
- 测试时轻松替换为 mock 实现,无需修改工厂逻辑
不复杂但容易忽略:Go 没有类和构造函数重载,所以工厂本质是“可读、可控、可测”的创建入口。只要保持接口稳定、工厂逻辑单一、新增类型不破现有调用,扩展就自然顺畅。










