简述
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
应用
对象成员比较多,创建对象逻辑较为繁琐。 日常的开发过程中,我经常会遇到一些复杂的数据结构,有很多成员甚至嵌套多个对象。例如:
obj := &MyObject{
Field1: &Field1 {
Param1: &Param1 {
Val: 0,
},
Param2: &Param2 {
Val: 1,
},
...
},
Field2: &Field2 {
Param3: &Param3 {
Val: 2,
},
...
},
...
}
以上类似的数据结构在创建方法有两个明显的缺点:
- 对对象使用者不友好,使用者在创建对象时需要知道的细节太多
- 代码可读性差
实现
-
定义结构体的初始化函数,例如:
func ***Builder() *struct_name {}
-
定义with*** 的方法用于属性赋值,With***方法的返回值为本身对象的类型,例如:
func (s struct_name) With**(param type) *struct_name {}
-
定义最终完成目标的对象的创建函数,例如:
func (s *struct_name) action() *struct_name {}
示例
定义构建者模式:
package builder
type Header struct {
Uuid string
Token string
}
type Body struct {
Msg string
}
type Request struct {
Header *Header
Body *Body
}
func RequestBuilder() *Request {
return &Request{
Header: &Header{},
Body: &Body{},
}
}
func (r *Request) WithUuid(uuid string) *Request {
r.Header.Uuid = uuid
return r
}
func (r *Request) WithToken(token string) *Request {
r.Header.Token = token
return r
}
func (r *Request) WithMsg(msg string) *Request {
r.Body.Msg = msg
return r
}
func (r *Request) Create() *Request {
// 执行其他操作
return r
}
调用构建者模式:
package main
import (
"github.com/design/pattern/builder"
)
func main() {
// 构建者模式调用
builder.RequestBuilder().WithUuid("uuid").WithToken("token").WithMsg("构建者模式").Create()
}