k8s源码设计模式之Builder

Builder模式也叫生成器模式,也叫建造者模式

关于生成器模式详情可查看文章

记录下k8s源码中使用到的Builder模式。
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
// staging/src/k8s.io/client-go/rest/request.go
// Request 构建一个请求发送给kube-apiserver.
// 其中有很多元素需要设置,但只一些是必须的
type Request struct {
c *RESTClient

warningHandler WarningHandler

rateLimiter flowcontrol.RateLimiter
backoff BackoffManager
timeout time.Duration
maxRetries int

// generic components accessible via method setters
verb string
pathPrefix string
subpath string
params url.Values
headers http.Header

// structural elements of the request that are part of the Kubernetes API conventions
namespace string
namespaceSet bool
resource string
resourceName string
subresource string

// output
err error

// only one of body / bodyBytes may be set. requests using body are not retriable.
body io.Reader
bodyBytes []byte

retryFn requestRetryFunc
}

// NewRequest 方法创建一个Request结构体并返回指针
func NewRequest(c *RESTClient) *Request {
...
r := &Request{
c: c,
rateLimiter: c.rateLimiter,
backoff: backoff,
timeout: timeout,
pathPrefix: pathPrefix,
maxRetries: 10,
retryFn: defaultRequestRetryFn,
warningHandler: c.warningHandler,
}
...
return r
}


func (r *Request) Verb(verb string) *Request {
r.verb = verb
return r
}


func (r *Request) Prefix(segments ...string) *Request {
if r.err != nil {
return r
}
r.pathPrefix = path.Join(r.pathPrefix, path.Join(segments...))
return r
}


func (r *Request) Suffix(segments ...string) *Request {
if r.err != nil {
return r
}
r.subpath = path.Join(r.subpath, path.Join(segments...))
return r
}
使用示例
1
2
r := NewRequest(clientSet)
r.Verb("Post").Prefix("apps")

REF:
1.client-go/rest/request.go