设计模式学习-建造者模式

基本概念

建造者模式主要用于分离对象的创建和配置。调用组件负责提供数据。并负责将配置数据传递给建造者。建造者代替调用组件去创建响应的对象。

好处

  • 使修改对象的默认值变简单
  • 调用组件无需关心太多对象的构建过程

何时使用

  • 对象创建需要进行复杂的配置。构造过程复杂。不想默认配置分散到程序的各个角落,此时可以使用建造者模式

示例程序

新建一个名为Builder的 OSX命令行程序

实现如下代码

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
98
99
100
101
102
103
104
///Food.swift
class Burger {
enum Cooked:String {
case rare = "Rare"
case normal = "Normal"
case wellDone = "Well Done"
}
let customerName:String
let veggieProduct:Bool
let patties:Int
let pickles:Bool
let mayo:Bool
let ketchup:Bool
let cook:Cooked
init(name:String,veggie:Bool,patties:Int,pickles:Bool,
mayo:Bool,ketchup:Bool,lettuce:Bool,cook:Cooked) {
self.customerName = name
self.veggieProduct = veggie
self.patties = patties
self.pickles = pickles
self.mayo = mayo
self.ketchup = ketchup
self.cook = cook
}
func printDescription() {
print("Name \(customerName)")
print("Vegie \(veggieProduct)")
print("Patties \(patties)")
print("Pickles \(pickles)")
print("Mayo \(mayo)")
print("Ketchup \(ketchup)")
print("Cook \(cook.rawValue)")
}
}
///BurgerBuilder.swift
final class BurgerBuilder {
private var veggie:Bool = false
private var pickles:Bool = false
private var mayo:Bool = true
private var ketchup:Bool = true
private var lettuce:Bool = true
private var cooked:Burger.Cooked = .normal
private var patties:Int = 2
func setVeggie(_ choice:Bool) -> BurgerBuilder{
veggie = choice
return self
}
func setPickles(_ choice:Bool) -> BurgerBuilder {
pickles = choice
return self
}
func setMayo(_ choice:Bool) -> BurgerBuilder {
mayo = choice
return self
}
func setKetchup(_ choice:Bool) -> BurgerBuilder {
ketchup = choice
return self
}
func setLettuce(_ choice:Bool) -> BurgerBuilder {
lettuce = choice
return self
}
func setCooked(_ choice:Burger.Cooked) -> BurgerBuilder {
cooked = choice
return self
}
func addPatty(_ choice:Bool) -> BurgerBuilder {
patties = choice ? 3 : 2
return self
}
func buildBurgerObject(name:String) -> Burger {
return Burger(name: name, veggie: veggie, patties: patties, pickles: pickles, mayo: mayo,
ketchup: ketchup, lettuce: lettuce, cook: cooked)
}
}
///main.swift
let builder = BurgerBuilder()
let burger:Burger = builder
.setVeggie(true)
.setMayo(false)
.setCooked(.wellDone)
.addPatty(false)
.buildBurgerObject(name: "Joe")
burger.printDescription()

输出结果

1
2
3
4
5
6
7
Name Joe
Vegie true
Patties 2
Pickles false
Mayo false
Ketchup true
Cook Well Done

上面代码中设置属性的方法返回值可以不写。这里这么写为了实现链式调用。

  • cocoa中建造者模式的应用
1
2
3
4
5
6
7
8
9
10
11
12
//// cocoa 中 建造者模式的应用
var dateBuilder = DateComponents()
dateBuilder.hour = 10
dateBuilder.day = 6
dateBuilder.month = 9
dateBuilder.year = 1950
dateBuilder.calendar = Calendar(identifier: .gregorian)
if let date = dateBuilder.date {
print(date)
}

输出结果:

1
1950-09-06 02:00:00 +0000

代码下载地址https://github.com/RockyAo/DesignPatternerLearn