抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
使用场景
抽象工厂模式通常适用于以下场景:
- 需要创建一系列相关或相互依赖的产品族: 抽象工厂模式可以用来创建一系列相关的产品,这些产品通常是相互依赖或者配合使用的,例如创建不同类型的操作系统(Windows、Linux、MacOS)以及每种操作系统对应的界面控件(按钮、文本框、菜单等)。
- 系统需要跨平台支持: 当系统需要在不同的平台上运行,并且每个平台需要使用不同的产品时,可以使用抽象工厂模式来封装不同平台下的产品创建逻辑,从而实现跨平台支持。
- 需要动态切换产品族: 当系统需要在运行时动态切换使用不同的产品族时,可以使用抽象工厂模式来封装不同产品族的创建逻辑,并在运行时根据条件选择合适的工厂来创建产品。
- 需要遵循特定的产品创建标准或约束: 当系统需要遵循特定的产品创建标准或约束时,可以使用抽象工厂模式来封装产品的创建过程,并确保所创建的产品都符合标准或约束。
- 需要隐藏具体产品的实现细节: 抽象工厂模式可以帮助隐藏具体产品的实现细节,客户端只需关心抽象产品和抽象工厂,无需了解具体产品的实现细节,从而降低了客户端与具体产品之间的耦合度。
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| package main
import "fmt"
type AbstractFactory interface { CreateButton() Button CreateTextBox() TextBox }
type Button interface { Click() string }
type TextBox interface { Input(text string) string }
type WindowsFactory struct{}
func (f *WindowsFactory) CreateButton() Button { return &WindowsButton{} }
func (f *WindowsFactory) CreateTextBox() TextBox { return &WindowsTextBox{} }
type WindowsButton struct{}
func (b *WindowsButton) Click() string { return "Windows button clicked" }
type WindowsTextBox struct{}
func (t *WindowsTextBox) Input(text string) string { return fmt.Sprintf("Windows text input: %s", text) }
type MacOSFactory struct{}
func (f *MacOSFactory) CreateButton() Button { return &MacOSButton{} }
func (f *MacOSFactory) CreateTextBox() TextBox { return &MacOSTextBox{} }
type MacOSButton struct{}
func (b *MacOSButton) Click() string { return "MacOS button clicked" }
type MacOSTextBox struct{}
func (t *MacOSTextBox) Input(text string) string { return fmt.Sprintf("MacOS text input: %s", text) }
func main() { winFactory := &WindowsFactory{} winButton := winFactory.CreateButton() winTextBox := winFactory.CreateTextBox() fmt.Println(winButton.Click()) fmt.Println(winTextBox.Input("Hello"))
macFactory := &MacOSFactory{} macButton := macFactory.CreateButton() macTextBox := macFactory.CreateTextBox() fmt.Println(macButton.Click()) fmt.Println(macTextBox.Input("Hello")) }
|
结语
在上面的示例中,我们以创建 GUI 库为例,展示了如何使用抽象工厂模式来创建不同平台上的按钮和文本框。
总的来说,抽象工厂模式适用于需要创建多个相关产品族的场景,以及需要跨平台、多产品族支持的系统。它是一种非常灵活、可扩展的设计模式,值得在适当的场景下使用。