工厂模式在Go中通过函数返回具体类型并结合接口抽象行为实现解耦,核心是用工厂函数封装new操作、对外暴露接口、隐藏具体类型,支持配置驱动、选项模式和依赖注入以提升灵活性与可测性。
工厂模式在 Go 中不是靠接口继承实现的,而是通过函数返回具体类型、结合接口抽象行为,达到解耦创建逻辑与使用逻辑的目的。核心在于:用一个函数(或结构体方法)封装 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"}
当构造参数变多或有可选配置时,避免长参数列表。采用函数式选项(Functional Options):
type Option func(*Client)
WithTimeout(30 * time.Second)、WithRetry(3)
func NewClient(opts ...Option) *Client,内部按需应用选项大型项目中,可将工厂注册到 DI 容器(如 Wire、Dig),由容器管理生
命周期和依赖关系:
func providePaymentProcessor(cfg Config) PaymentProcessor
不复杂但容易忽略:Go 没有类和构造函数重载,所以工厂本质是“可读、可控、可测”的创建入口。只要保持接口稳定、工厂逻辑单一、新增类型不破现有调用,扩展就自然顺畅。