如何使用Golang实现抽象工厂模式_生成系列相关对象

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

抽象工厂模式用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。在 Go 中,由于没有类和继承机制,我们通过接口(interface{})定义产品族契约,用结构体实现具体产品,并用工厂函数或结构体封装创建逻辑。

定义产品接口与具体实现

先为每个产品类型定义接口,再为不同系列(如“Windows 风格”和“Mac 风格”)提供具体实现。

例如,设计 UI 控件工厂,包含 ButtonCheckbox

// 产品接口
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" }

声明抽象工厂接口

定义一个工厂接口,声明创建每种产品的抽象方法:

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 中的抽象工厂不依赖继承,靠接口组合和值语义达成松耦合。关键在于:接口定义能力、工厂封装创建逻辑、客户端面向接口编程。不复杂但容易忽略的是——所有同系列产品必须由同一工厂实例创建,才能保证风格一致。