抽象工厂模式在Go中通过接口定义产品族契约、结构体实现具体产品、工厂函数或结构体封装创建逻辑来实现;例如定义Button和Checkbox接口及Windows/Mac实现,再声明GUIFactory接口并实现WinFactory和MacFactory,客户端通过Application函数解耦使用。

抽象工厂模式用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。在 Go 中,由于没有类和继承机制,我们通过接口(interface{})定义产品族契约,用结构体实现具体产品,并用工厂函数或结构体封装创建逻辑。
定义产品接口与具体实现
先为每个产品类型定义接口,再为不同系列(如“Windows 风格”和“Mac 风格”)提供具体实现。
例如,设计 UI 控件工厂,包含 Button 和 Checkbox:
// 产品接口
type Button interface {
Render() string
}
type Checkbox interface {
Toggle() string
}
// Windows 系列实现
type WinButton struct{}
func (w WinButton) Render() string { return "Rendering a Windows button" }
type WinCheckbox struct{}
func (w WinCheckbox) Toggle() string { return "Toggling a Windows checkbox" }
// Mac 系列实现
type MacButton struct{}
func (m MacButton) Render() string { return "Rendering a macOS button" }
type MacCheckbox struct{}
func (m MacCheckbox) Toggle() string { return "Toggling a macOS checkbox" }
声明抽象工厂接口
定义一个工厂接口,声明创建每种产品的抽象方法:
立即学习“go语言免费学习笔记(深入)”;
type GUIFactory interface {
CreateButton() Button
CreateCheckbox() Checkbox
}
该接口不关心具体返回哪个实现,只保证返回符合契约的对象。
实现具体工厂
为每个产品系列编写一个结构体(可空结构体),并实现 GUIFactory 接口:
type WinFactory struct{}
func (w WinFactory) CreateButton() Button { return WinButton{} }
func (w WinFactory) CreateCheckbox() Checkbox { return WinCheckbox{} }
type MacFactory struct{}
func (m MacFactory) CreateButton() Button { return MacButton{} }
func (m MacFactory) CreateCheckbox() Checkbox { return MacCheckbox{} }
这样,调用方只需持有 GUIFactory 接口,就能统一创建配套对象,无需感知具体平台。
客户端使用示例
客户端代码完全解耦于具体实现,只依赖接口:
func Application(factory GUIFactory) {
button := factory.CreateButton()
checkbox := factory.CreateCheckbox()
println(button.Render())
println(checkbox.Toggle())
}
// 使用时传入具体工厂实例
func main() {
Application(WinFactory{}) // 输出 Windows 风格
Application(MacFactory{}) // 输出 macOS 风格
}
新增产品系列(如 Linux)只需新增实现结构体和工厂,不修改现有客户端或接口。
Go 中的抽象工厂不依赖继承,靠接口组合和值语义达成松耦合。关键在于:接口定义能力、工厂封装创建逻辑、客户端面向接口编程。不复杂但容易忽略的是——所有同系列产品必须由同一工厂实例创建,才能保证风格一致。










