适用场景

Overview

classDiagram

class Product {
  <>
  +doStuff()
}

class ConcreteProductA
class ConcreteProductB

Product <|.. ConcreteProductA
Product <|.. ConcreteProductB

class Creator {
  +someOperation()
  +createProduct() Product
}

class ConcreteCreatorA {
  +createProduct() Product
}

class ConcreteCreatorB {
  +createProduct() Product
}

Creator <|-- ConcreteCreatorA
Creator <|-- ConcreteCreatorB

Creator ..> Product : creates

伪代码

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
/* ===== Factory ===== */
/// 创建者类声明的工厂方法必须返回一个产品类的对象。
/// 创建者的子类通常会提供该方法的实现。
class Dialog {
/// 创建者还可提供一些工厂方法的默认实现
abstract auto createButton() -> Button;

/// 请注意,创建者的主要职责并非是创建产品。其中通常会包含一些核心业务
/// 逻辑,这些逻辑依赖于由工厂方法返回的产品对象。子类可通过重写工厂方
/// 法并使其返回不同类型的产品来间接修改业务逻辑。
auto render() {
Button okBUtton = createButton()
okButton.onClick(closeDialog)
okButton.render()
}
}

/* ===== Concrete factory ===== */
/// 具体创建者将重写工厂方法以改变其所返回的产品类型。
class WindowsDialog extends Dialog {
auto createButton() -> Button {
return new WindowsButton()
}
}

class WebDialog(Dialog) {
auto createButton() -> Button {
return new HTMLButton()
}
}

/* ===== Product interface ===== */
/// 产品接口中将声明所有具体产品都必须实现的操作。
interface Button {
auto render() -> void;
auto onClick(f) -> void;
}

/* ===== Concrete product ===== */
// 具体产品需提供产品接口的各种实现。
class WindowsButton implements Button {
auto render() -> void { ... }
// 根据 Windows 样式渲染按钮。
auto onClick(f) -> void { ... }
// 绑定本地操作系统点击事件。
}

class HTMLButton implements Button {
auto render(a, b) -> void { ... }
// 返回一个按钮的 HTML 表述。
auto onClick(f) -> void { ... }
// 绑定网络浏览器的点击事件。
}

/* ===== Application ===== */
if (application == "os") {
dialog = new WindowsDialog()
} else {
dialog = new HTMLDialog()
}