建造者模式(Builder Pattern)

768 阅读1分钟

简述

建造者模式(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()
}