这种模式也是 go 推荐的模式,叫 Option Pattern ,是 go 的最佳实践之一。go 语言团队的 rob 早在 11 年前,就发文提出了这种模式,具体链接是 https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html ,这种模式避免了构造函数参数过多或需要导出过多内部字段的问题。
设计模式是所有语言通用的,builder Pattern 和 Option Pattern 都有它们各自的优点。
而 java 之所以多使用 Builder 是因为早期语言不区分空置,比如一个 Boolean 类型的变量,如果没有初始化,默认就是 false ,那么你如何区分它是赋值了 false ,还是没有赋值?这就是为什么引入了 builder 。
Option 模式是为了解决 go 中没有 get 和 set 的不足,当一个 struct 有很多成员都需要初始化,又为了安全不将它们为公开,或者设置为公开时,也很难保证外部调用 struct 一一传递,就算保证了一一传递,也很难在写代码时有提示。打个比方,一个 struct 有 100 个成员要初始化,难道你提供导出一个 100 个参数的 New 函数吗?或者不提供 New 函数,直接让 Struct 公开,让所有人调用的时候一一传递成员? Option 模式就可以解决这个问题。在初始化的时候,直接初始化默认值,并导出需要修改的函数,让调用方可以视情况自定义。
设计模式是所有语言通用的,builder Pattern 和 Option Pattern 都有它们各自的优点。
而 java 之所以多使用 Builder 是因为早期语言不区分空置,比如一个 Boolean 类型的变量,如果没有初始化,默认就是 false ,那么你如何区分它是赋值了 false ,还是没有赋值?这就是为什么引入了 builder 。
Option 模式是为了解决 go 中没有 get 和 set 的不足,当一个 struct 有很多成员都需要初始化,又为了安全不将它们为公开,或者设置为公开时,也很难保证外部调用 struct 一一传递,就算保证了一一传递,也很难在写代码时有提示。打个比方,一个 struct 有 100 个成员要初始化,难道你提供导出一个 100 个参数的 New 函数吗?或者不提供 New 函数,直接让 Struct 公开,让所有人调用的时候一一传递成员? Option 模式就可以解决这个问题。在初始化的时候,直接初始化默认值,并导出需要修改的函数,让调用方可以视情况自定义。










