Skip to content
← 返回设计模式列表
设计意图与对象责任

抽象工厂 ​

成套创建相互匹配的对象。

创建型

说明 ​

当一组组件必须保持同一风格或环境时,由一个工厂统一产出。

分析 ​

一个工厂负责生产同一产品族中的多个对象,例如同一平台的按钮和对话框。调用方切换 WebUI 时,两种组件一起切换,不会意外混用不兼容的实现。

UI 同时规定 Button 与 Dialog 两类产品,WebUI 提供同一平台的一套实现。切换另一套工厂应让整套创建一起替换;若客户端绕过工厂直接构造异平台组件,产品族一致性仍会被破坏。新增平台主要增加实现,新增产品种类则会影响每套工厂。

查看图表代码

适用前提与边界 ​

代价是增加新产品种类时需要修改所有工厂接口和实现。 创建过程没有复用或选择需求时,直接构造通常更清楚。

示例输入与调用 ​

go
var ui UI = WebUI{}
	fmt.Println(ui.Button().Label(), ui.Dialog().Title())

运行输出 ​

text
web button web dialog

完整 Go 示例 ​

go
package main

import "fmt"

type Button interface{ Label() string }
type Dialog interface{ Title() string }
type UI interface {
	Button() Button
	Dialog() Dialog
}
type WebUI struct{}
type WebButton struct{}
type WebDialog struct{}

func (WebButton) Label() string {
	return "web button"
}
func (WebDialog) Title() string {
	return "web dialog"
}
func (WebUI) Button() Button {
	return WebButton{}
}
func (WebUI) Dialog() Dialog {
	return WebDialog{}
}

func main() {
	var ui UI = WebUI{}
	fmt.Println(ui.Button().Label(), ui.Dialog().Title())
}

继续阅读