Go通过接口定义产品族契约、结构体实现具体工厂、函数返回产品实例,实现轻量清晰的抽象工厂模式,核心是封装一族相关产品的创建逻辑。
用 Go 实现抽象工厂模式,核心是用接口定义产品族的创建契约,再用具体工厂实现不同产品组合的生成逻辑。Go 没有类继承,但通过接口 + 结构体组合 + 函数返回值,能干净地表达“一族相关产品由同一工厂创建”的设计意图。
先为每个产品类型(如 Button、Checkbox)定义接口,再为不同主题(如 Windows、Mac)提供具体实现:
这样,同一主题下的按钮和复选框在外观或行为上保持风格一致,为后续统一创建打下基础。
定义一个 Factory 接口,声明创建各类产品的抽象方法:
这个接口不关心具体怎么创建,只承诺“能产出一套匹配的产品”。它就是抽象工厂的契约,也是客户端依赖的唯一工厂类型。
为每个产品族实现工厂结构体,比如 WindowsFactory 和 MacFactory:
注意:工厂本身不保存状态,通常以零值结构体或空结构体(如 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 的接口即抽象、结构体即实现、函数即构造器,三者配合让抽象工厂既轻量又清晰。关键不是模仿其他语言的继承写法,而是抓住“封装产品族创建”这一本质。