创建型-建造者模式

建造者模式

建造者模式(Builder Patten)

定义

将一个复杂对象的构建和他的表示分离,使得同样的构建过程可以创建不同的表示。

应用场景

  1. 类中属性比较多
  2. 类属性之间有一定的依赖关系,或者是约束条件
  3. 存在必选和非必选属性
  4. 希望创建不可变的对象

Go源码实现

实现

在Golang的实现中有别与Java中常见的实现,因为在Go中不能进行函数的连续调用。所以一般将必选参数和可选参数分离,可选参数作为函数的形式进行输入。可对不同的参数进行不同的校验,代码示例如下

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
package builder

var defaultMaxSize = 10
var defaultMinSize = 0
var defaultIdleSize = 1

// go语言中通常以如下方式来构造复杂参数对象,非传统建造者模式
// 说明:资源池配置,name为必传参数,其他为可选参数
type ResourcePoolConfig struct {
// 必传参数
name string
// 可选参数
maxSize int
minSize int
idleSize int
}

type ResourcePoolConfigOptions struct {
maxSize int
minSize int
idleSize int
}

type ResourcePoolConfigOptionsFun func(option *ResourcePoolConfigOptions)

func NewResourcePoolConfig(name string, opts ...ResourcePoolConfigOptionsFun) ResourcePoolConfig {
if name == "" {
panic("name can not be nil")
}

options := &ResourcePoolConfigOptions{
maxSize: defaultMaxSize,
minSize: defaultMinSize,
idleSize: defaultIdleSize,
}

for _, opt := range opts {
opt(options)
}

if options.maxSize > 10 || options.minSize < 0 {
panic("scale is not vaild")
}

if options.idleSize > options.maxSize || options.idleSize < options.minSize {
panic("idleSize is not vaild")
}
return ResourcePoolConfig{
name: name,
maxSize: options.maxSize,
minSize: options.minSize,
idleSize: options.idleSize,
}
}

使用

使用时通过构造函数的形式,传入参数。若未传入的参数可以设置默认值

1
2
3
4
5
6
myOptsFun := func(option *ResourcePoolConfigOptions) {
option.idleSize = 2
}

c := NewResourcePoolConfig("usage", myOptsFun)