抽象工厂是一种创造性的设计模式,允许您创建相关对象而无需指定其具体类。
假设您正在开发一个 GUI 工具包,该工具包应该支持多种外观标准(例如 Windows、macOS、Linux)。每个外观标准都需要一组不同的 UI 组件,例如按钮、复选框和滚动条。
如果没有抽象工厂模式,您将不得不编写大量条件代码来根据当前的外观标准来处理这些组件的创建。这种方法不可扩展,并且使代码库难以维护和扩展。
通过使用抽象工厂模式,您可以创建一个用于创建相关对象系列(例如按钮、复选框、滚动条)的接口,并为每个外观标准实现该接口。这样,客户端代码就可以使用任何外观标准,而无需了解组件创建方式的细节。
考虑一家家具厂,生产古典和现代等不同风格的椅子和桌子。
每种风格都需要不同的组件(例如腿、靠背、扶手)和材料(例如木材、金属、塑料)。
package main import "fmt" // Abstract Factory type FurnitureFactory interface { MakeChair() Chair MakeTable() Table } func NewFurnitureFactory(style string) (FurnitureFactory, error) { if style == "classic" { return &Classic{}, nil } if style == "modern" { return &Modern{}, nil } return nil, fmt.Errorf("Style %s is not supported", style) } type Chair struct { Name string Material string } type Table struct { Name string Material string } // Concrete Classic Factory type Classic struct{} func (a *Classic) MakeChair() Chair { return Chair{ Name: "Classic Chair", Material: "Wood", } } func (a *Classic) MakeTable() Table { return Table{ Name: "Classic Table", Material: "Wood", } } // Concrete Modern Factory type Modern struct{} func (n *Modern) MakeChair() Chair { return Chair{ Name: "Modern Chair", Material: "Plastic", } } func (n *Modern) MakeTable() Table { return Table{ Name: "Modern Table", Material: "Plastic", } } func main() { factory, _ := NewFurnitureFactory("classic") chair := factory.MakeChair() table := factory.MakeTable() fmt.Printf("Chair: %s\n", chair.Name) fmt.Printf("Table: %s\n", table.Name) factory, _ = NewFurnitureFactory("modern") chair = factory.MakeChair() table = factory.MakeTable() fmt.Printf("Chair: %s\n", chair.Name) fmt.Printf("Table: %s\n", table.Name) }
此代码通过创建不同风格(经典和现代)的家具(椅子和桌子)来演示抽象工厂模式。它定义了一个接口,用于创建相关对象系列和每种样式的具体实现,从而轻松扩展和维护。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3