建造者模式用于构造复杂配置对象,通过链式调用设置字段并返回最终实例。定义ClientConfig结构体与ClientConfigBuilder建造者,提供默认值与各类Set方法,最后通过Build输出不可变对象。

在go语言中,建造者模式(Builder Pattern)常用于构造复杂的配置对象,特别是当结构体字段较多、部分字段可选、需要链式调用设置时。它能提升代码的可读性和可维护性,避免使用大量参数的构造函数或暴露结构体字段。
定义配置结构体和建造者
假设我们要构建一个http客户端的配置对象,包含超时、重试次数、用户代理等可选字段。
示例:
先定义配置结构体和建造者:
<pre class="brush:php;toolbar:false;">type ClientConfig struct { Timeout int Retries int UserAgent string proxy string TLS bool } type ClientConfigBuilder struct { config *ClientConfig }
提供构造函数和设置方法
创建一个新实例,并通过方法链逐步设置字段:
立即学习“go语言免费学习笔记(深入)”;
<pre class="brush:php;toolbar:false;">// NewClientConfigBuilder 返回一个新的建造者实例 func NewClientConfigBuilder() *ClientConfigBuilder { return &ClientConfigBuilder{ config: &ClientConfig{ Timeout: 30, // 默认值 Retries: 3, TLS: true, }, } } // SetTimeout 设置超时时间 func (b *ClientConfigBuilder) SetTimeout(timeout int) *ClientConfigBuilder { b.config.Timeout = timeout return b } // SetRetries 设置重试次数 func (b *ClientConfigBuilder) SetRetries(retries int) *ClientConfigBuilder { b.config.Retries = retries return b } // SetUserAgent 设置用户代理 func (b *ClientConfigBuilder) SetUserAgent(ua string) *ClientConfigBuilder { b.config.UserAgent = ua return b } // SetProxy 设置代理地址 func (b *ClientConfigBuilder) SetProxy(proxy string) *ClientConfigBuilder { b.config.Proxy = proxy return b } // DisableTLS 关闭TLS func (b *ClientConfigBuilder) DisableTLS() *ClientConfigBuilder { b.config.TLS = false return b }
构建最终对象
添加 Build 方法返回不可变的配置对象:
<pre class="brush:php;toolbar:false;">// Build 返回最终的配置对象 func (b *ClientConfigBuilder) Build() *ClientConfig { // 可在此处添加校验逻辑 if b.config.Timeout <= 0 { panic("timeout must be greater than 0") } return b.config }
使用方式如下:
<pre class="brush:php;toolbar:false;">config := NewClientConfigBuilder(). SetTimeout(10). SetRetries(5). SetUserAgent("my-app/1.0"). SetProxy("http://proxy.example.com:8080"). DisableTLS(). Build() // 使用 config 创建客户端 fmt.Printf("%+vn", config)
这种方式让配置创建清晰、安全且易于扩展。如果将来新增字段,只需在建造者中添加对应方法,不影响已有代码。
基本上就这些。建造者模式在Go中虽不如java那样常见,但在构造复杂配置时非常实用。


