抽象工厂
成套创建相互匹配的对象。
创建型
说明
当一组组件必须保持同一风格或环境时,由一个工厂统一产出。
分析
一个工厂负责生产同一产品族中的多个对象,例如同一平台的按钮和对话框。调用方切换 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())
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任