抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

使用场景

抽象工厂模式通常适用于以下场景:

  1. 需要创建一系列相关或相互依赖的产品族: 抽象工厂模式可以用来创建一系列相关的产品,这些产品通常是相互依赖或者配合使用的,例如创建不同类型的操作系统(Windows、Linux、MacOS)以及每种操作系统对应的界面控件(按钮、文本框、菜单等)。
  2. 系统需要跨平台支持: 当系统需要在不同的平台上运行,并且每个平台需要使用不同的产品时,可以使用抽象工厂模式来封装不同平台下的产品创建逻辑,从而实现跨平台支持。
  3. 需要动态切换产品族: 当系统需要在运行时动态切换使用不同的产品族时,可以使用抽象工厂模式来封装不同产品族的创建逻辑,并在运行时根据条件选择合适的工厂来创建产品。
  4. 需要遵循特定的产品创建标准或约束: 当系统需要遵循特定的产品创建标准或约束时,可以使用抽象工厂模式来封装产品的创建过程,并确保所创建的产品都符合标准或约束。
  5. 需要隐藏具体产品的实现细节: 抽象工厂模式可以帮助隐藏具体产品的实现细节,客户端只需关心抽象产品和抽象工厂,无需了解具体产品的实现细节,从而降低了客户端与具体产品之间的耦合度。

实现代码

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"

// AbstractFactory 是抽象工厂接口,定义了创建按钮和文本框的方法
type AbstractFactory interface {
CreateButton() Button
CreateTextBox() TextBox
}

// Button 是按钮接口
type Button interface {
Click() string
}

// TextBox 是文本框接口
type TextBox interface {
Input(text string) string
}

// WindowsFactory 是 Windows 平台的工厂,实现了 AbstractFactory 接口
type WindowsFactory struct{}

// CreateButton 实现了 AbstractFactory 接口中的 CreateButton 方法
func (f *WindowsFactory) CreateButton() Button {
return &WindowsButton{}
}

// CreateTextBox 实现了 AbstractFactory 接口中的 CreateTextBox 方法
func (f *WindowsFactory) CreateTextBox() TextBox {
return &WindowsTextBox{}
}

// WindowsButton 是 Windows 平台的按钮,实现了 Button 接口
type WindowsButton struct{}

// Click 实现了 Button 接口中的 Click 方法
func (b *WindowsButton) Click() string {
return "Windows button clicked"
}

// WindowsTextBox 是 Windows 平台的文本框,实现了 TextBox 接口
type WindowsTextBox struct{}

// Input 实现了 TextBox 接口中的 Input 方法
func (t *WindowsTextBox) Input(text string) string {
return fmt.Sprintf("Windows text input: %s", text)
}

// MacOSFactory 是 MacOS 平台的工厂,实现了 AbstractFactory 接口
type MacOSFactory struct{}

// CreateButton 实现了 AbstractFactory 接口中的 CreateButton 方法
func (f *MacOSFactory) CreateButton() Button {
return &MacOSButton{}
}

// CreateTextBox 实现了 AbstractFactory 接口中的 CreateTextBox 方法
func (f *MacOSFactory) CreateTextBox() TextBox {
return &MacOSTextBox{}
}

// MacOSButton 是 MacOS 平台的按钮,实现了 Button 接口
type MacOSButton struct{}

// Click 实现了 Button 接口中的 Click 方法
func (b *MacOSButton) Click() string {
return "MacOS button clicked"
}

// MacOSTextBox 是 MacOS 平台的文本框,实现了 TextBox 接口
type MacOSTextBox struct{}

// Input 实现了 TextBox 接口中的 Input 方法
func (t *MacOSTextBox) Input(text string) string {
return fmt.Sprintf("MacOS text input: %s", text)
}

func main() {
// 创建 Windows 平台的工厂
winFactory := &WindowsFactory{}
// 使用 Windows 平台工厂创建按钮和文本框
winButton := winFactory.CreateButton()
winTextBox := winFactory.CreateTextBox()
// 使用按钮和文本框
fmt.Println(winButton.Click())
fmt.Println(winTextBox.Input("Hello"))

// 创建 MacOS 平台的工厂
macFactory := &MacOSFactory{}
// 使用 MacOS 平台工厂创建按钮和文本框
macButton := macFactory.CreateButton()
macTextBox := macFactory.CreateTextBox()
// 使用按钮和文本框
fmt.Println(macButton.Click())
fmt.Println(macTextBox.Input("Hello"))
}

结语

在上面的示例中,我们以创建 GUI 库为例,展示了如何使用抽象工厂模式来创建不同平台上的按钮和文本框。
总的来说,抽象工厂模式适用于需要创建多个相关产品族的场景,以及需要跨平台、多产品族支持的系统。它是一种非常灵活、可扩展的设计模式,值得在适当的场景下使用。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。