Go语言中的建造者模式:告别混乱的对象构造
为啥需要建造者模式?
Go语言以简单著称,但是当我们要创建一个有很多字段的复杂对象时,代码就会变得又臭又长还容易出错。就像你组装一台电脑,如果把所有零件一次性堆给你,你肯定会手忙脚乱。建造者模式就像有个贴心的装机师傅,帮你一步步组装好电脑。
举个栗子
想象我们要配置一个服务器,有这么多选项:
type ServerConfig struct { Host string // 主机地址 Port int // 端口号 TLS bool // 是否加密 Timeout int // 超时时间 MaxRetries int // 最大重试次数 LogLevel string // 日志级别 }
|
如果用传统构造函数:
// 这参数多的跟春运火车似的,谁记得住哪个是哪个啊! NewServerConfig("localhost", 8080, false, 30, 5, "info")
|
建造者模式来拯救!
基础版建造者
就像点奶茶一样,一步步选配料:
builder := &ServerConfigBuilder{} builder.SetHost("localhost") // 1.选主机 builder.SetPort(8080) // 2.选端口 builder.EnableTLS() // 3.加个加密 builder.SetTimeout(30) // 4.设个超时 builder.SetRetries(5) // 5.重试次数
config := builder.Build() // 最终做好啦!
|
进阶版:链式调用
更酷炫的写法,像乐高一样可以连起来:
config := NewServerBuilder(). SetHost("localhost"). // 设置主机 SetPort(8080). // 设置端口 EnableTLS(). // 开启加密 SetTimeout(30). // 超时30秒 SetRetries(5). // 重试5次 Build() // 大功告成!
|
还能更智能!
自动检查:建造前会检查配置是否合理,比如TLS加密必须用443端口
预设方案:像奶茶店有"经典款"、"网红款"一样,可以预设常用配置
复制修改:基于已有配置微调,不用从头开始
Go语言更地道的写法:函数选项模式
Go语言还有个更酷的写法,像点菜加料一样:
cfg := NewServerConfig( WithHost("myserver"), // 加主机 WithTLS(true), // 加加密 WithTimeout(60), // 加超时 )
|
这种写法:
- 更简洁
- 自带默认值
- 灵活组合
- 很多知名Go库都在用
该用哪种?
- 简单对象:直接写 ServerConfig{Host:"localhost"}
- 中等复杂度:函数选项模式(最Go范儿)
- 超复杂配置:建造者模式(更清晰可控)
就像选工具:
- 拧螺丝用手拧就行(简单)
- 装家具用螺丝刀(中等)
- 盖房子得用电钻(复杂)
记住:没有最好的,只有最合适的!根据实际情况灵活选择才是王道~