Go通过接口定义产品族契约、结构体实现具体工厂、函数返回产品实例,实现轻量清晰的抽象工厂模式,核心是封装一族相关产品的创建逻辑。

用 Go 实现抽象工厂模式,核心是用接口定义产品族的创建契约,再用具体工厂实现不同产品组合的生成逻辑。Go 没有类继承,但通过接口 + 结构体组合 + 函数返回值,能干净地表达“一族相关产品由同一工厂创建”的设计意图。
定义产品接口与具体实现
先为每个产品类型(如 Button、Checkbox)定义接口,再为不同主题(如 Windows、Mac)提供具体实现:
- Button 接口:包含 Render() 方法
- WindowsButton 和 MacButton 分别实现 Button 接口
- 同理定义 Checkbox 接口及 WindowsCheckbox / MacCheckbox
这样,同一主题下的按钮和复选框在外观或行为上保持风格一致,为后续统一创建打下基础。
声明抽象工厂接口
定义一个 Factory 接口,声明创建各类产品的抽象方法:
- CreateButton() Button
- CreateCheckbox() Checkbox
这个接口不关心具体怎么创建,只承诺“能产出一套匹配的产品”。它就是抽象工厂的契约,也是客户端依赖的唯一工厂类型。
实现具体工厂
为每个产品族实现工厂结构体,比如 WindowsFactory 和 MacFactory:
- WindowsFactory 的 CreateButton() 返回 &WindowsButton{}
- WindowsFactory 的 CreateCheckbox() 返回 &WindowsCheckbox{}
- MacFactory 同理,返回对应 Mac 风格实例
注意:工厂本身不保存状态,通常以零值结构体或空结构体(如 type WindowsFactory struct{})存在,靠方法直接 new 并返回新对象。
客户端使用:只依赖抽象,不碰具体类型
业务代码接收一个 Factory 接口,调用其方法获取产品,完全不知道背后是 Windows 还是 Mac:
func renderUI(f Factory) {
btn := f.CreateButton()
cb := f.CreateCheckbox()
btn.Render()
cb.Render()
}
调用时传入 WindowsFactory{} 或 MacFactory{} 即可切换整套 UI 风格。新增主题只需加新工厂和对应产品,不修改现有客户端逻辑。
基本上就这些。Go 的接口即抽象、结构体即实现、函数即构造器,三者配合让抽象工厂既轻量又清晰。关键不是模仿其他语言的继承写法,而是抓住“封装产品族创建”这一本质。










