理论:
在建造者模式中,通常有以下几个角色:
- Builder(建造者):定义了构建对象的抽象接口,包含了构建对象的各个步骤。
- ConcreteBuilder(具体建造者):实现了Builder接口,负责实现构建对象的各个步骤,并返回最终构建的对象。
- Director(指挥者):负责调用具体建造者来构建对象,它并不知道具体的构建细节,只知道调用构建者的方法来构建对象。
- Product(产品):表示最终构建出的对象,包含了各个部分的属性。
建造者模式的优点包括:
- 可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
- 可以更加精细地控制对象的构建过程,灵活性高。
- 可以避免构造函数的参数列表过长,提高代码的可读性和可维护性。
建造者模式适用于以下情况:
- 当需要创建的对象包含复杂的内部结构,且需要将构建过程与表示分离时。
- 当需要构建的对象具有不同的表示形式,但构建步骤相同或相似时。
- 当需要精细控制对象的构建过程,以满足不同的需求时。
总结起来,建造者模式通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它可以更加灵活地控制对象的构建过程,提高代码的可读性和可维护性。建造者模式适用于需要创建复杂对象且构建过程复杂的情况。
直接上案例讲解
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
|
package main
import "fmt"
// Product 表示正在构建的对象
type Product struct {
partA string
partB string
partC string
}
// Builder 定义创建产品的接口
type Builder interface {
buildPartA() Builder
buildPartB() Builder
buildPartC() Builder
getProduct() Product
}
var _ Builder = &ConcreteBuilder{}
// ConcreteBuilder 实现了Builder接口
type ConcreteBuilder struct {
product Product
}
func (b *ConcreteBuilder) buildPartA() Builder {
b.product.partA = "Part A"
return b
}
func (b *ConcreteBuilder) buildPartB() Builder {
b.product.partB = "Part B"
return b
}
func (b *ConcreteBuilder) buildPartC() Builder {
b.product.partC = "Part C"
return b
}
func (b *ConcreteBuilder) getProduct() Product {
return b.product
}
// Director 使用Builder来管理构建过程
type Director struct {
builder Builder
}
func (d *Director) construct() {
d.builder.buildPartA().buildPartB().buildPartC()
}
func main() {
builder := &ConcreteBuilder{}
director := &Director{builder: builder}
director.construct()
product := builder.getProduct()
fmt.Printf("产品部件: %s, %s, %s\n", product.partA, product.partB, product.partC)
}
|
这个案例中,我们定义了一个产品(Product)和一个建造者(Builder)接口。具体的建造者(ConcreteBuilder)实现了建造者接口,并负责构建产品的各个部分。Director(导演)负责使用建造者来构建产品。 接口返回本身接口,可以支持主流的流式编程
在主函数中,我们创建了一个具体的建造者和导演,并通过导演来构建产品。最后,我们打印出产品的各个部分。
运行以上代码将输出:
1
|
产品部件: Part A, Part B, Part C
|
这个案例展示了如何使用建造者模式来构建复杂对象,通过将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。