全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何使用Golang实现建造者模式复杂对象组装_使用Builder Pattern组装复杂对象

建造者模式适合组装属性多、创建逻辑复杂且需分步构造的对象;Go通过结构体+链式调用+可选参数实现,含Builder类型、Set方法链式调用、Build校验与返回不可变对象。

建造者模式适合用来组装属性多、创建逻辑复杂、且需要分步骤构造的对象。Golang 没有构造函数重载和方法重载,但通过结构体 + 链式调用 + 可选参数的 Builder 实现,既清晰又灵活。

定义 Builder 结构体与目标对象

先设计最终要构建的复杂对象(比如 ServerConfig),再为其配套一个 Builder 类型(如 ServerConfigBuilder)。Builder 内部持有目标对象字段的副本,提供设置方法并返回自身,支持链式调用。

示例:

type ServerConfig struct {
    Host     string
    Port     int
    TLS      bool
    Timeout  int
    LogLevel string
}

type ServerConfigBuilder struct {
    config ServerConfig
}

func NewServerConfigBuilder() *ServerConfigBuilder {
    return &ServerConfigBuilder{
        config: ServerConfig{
            Port:     8080,
            Timeout:  30,
            LogLevel: "info",
        },
    }
}

为每个可配置项提供 Set 方法

每个 SetXXX 方法只负责更新对应字段,并返回 *ServerConfigBuilder,保证链式调用不断开。不校验或执行副作用,保持 Builder 轻量。

  • SetHost(host string) *ServerConfigBuilder
  • SetPort(port int) *ServerConfigBuilder
  • EnableTLS() *ServerConfigBuilder(布尔开关常用无参方法)
  • SetTimeout(seconds int) *ServerConfigBuilder
  • SetLogLevel(level string) *ServerConfigBuilder

实现示例:

func (b *ServerConfigBuilder) SetHost(host string) *ServerConfigBuilder {
    b.config.Host = host
    return b
}

func (b *ServerConfigBuilder) EnableTLS() *ServerConfigBuilder {
    b.config.TLS = true
    return b
}

提供 Build() 方法完成最终组装

Build() 是 Builder 的终点,它应做两件事:一是校验必要字段(如 Host 不为空),二是返回不可变的最终对象(通常返回值类型是结构体而非指针,避免外部篡改)。

校验失败时可 panic 或返回 error —— 推荐返回 error 更可控:

func (b *ServerConfigBuilder) Build() (*ServerConfig, error) {
    if b.config.Host == "" {
        return nil, fmt.Errorf("Host is required")
    }
    // 可选:深拷贝或冻结字段(如转为只读字段)
    cfg := b.config // 值拷贝,安全
    return &cfg, nil
}

使用方式简洁直观

用户无需记忆参数顺序,不用传一堆零值占位,也不用手动初始化中间状态。组合过程语义清晰,IDE 还能自动补全提示。

示例调用:

cfg, err := NewServerConfigBuilder().
    SetHost("api.example.com").
    SetPort(443).
    EnableTLS().
    SetTimeout(60).
    SetLogLevel("debug").
    Build()
if err != nil {
    log.Fatal(err)
}
// cfg 已就绪,可直接使用

基本上就这些。Builder 在 Golang 中不是靠语法糖,而是靠显式设计和链式约定达成的——不复杂但容易忽略校验和不可变性。


# go  # golang  # red  # String  # 构造函数  # Error  # 结构体  # int  # 指针  #   # 值类型  # 函数重载  # 对象  # ide  # 链式  # 可选  # 还能  # 一是  # 布尔  # 可直接  # 而非  # 件事  # 为空  # 再为 


相关文章: 如何在Ubuntu系统下快速搭建WordPress个人网站?  Android使用GridView实现日历的简单功能  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何选择适配移动端的WAP自助建站平台?  b2c电商网站制作流程,b2c水平综合的电商平台?  ,巨量百应是干嘛的?  存储型VPS适合搭建中小型网站吗?  如何在阿里云ECS服务器部署织梦CMS网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  建站org新手必看:2024最新搭建流程与模板选择技巧  宝塔面板创建网站无法访问?如何快速排查修复?  建站主机解析:虚拟主机配置与服务器选择指南  如何打造高效商业网站?建站目的决定转化率  高防服务器租用首荐平台,企业级优惠套餐快速部署  c# 在ASP.NET Core中管理和取消后台任务  如何高效配置IIS服务器搭建网站?  内网网站制作软件,内网的网站如何发布到外网?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  ,购物网站怎么盈利呢?  html制作网站的步骤有哪些,iapp如何添加网页?  建站之星安装后界面空白如何解决?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  建站之星如何开启自定义404页面避免用户流失?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  大连网站制作公司哪家好一点,大连买房网站哪个好?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  济南专业网站制作公司,济南信息工程学校怎么样?  如何通过.red域名打造高辨识度品牌网站?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何制作一个表白网站视频,关于勇敢表白的小标题?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  网站微信制作软件,如何制作微信链接?  如何通过西部数码建站助手快速创建专业网站?  宝塔建站后网页无法访问如何解决?  如何在建站之星绑定自定义域名?  婚礼视频制作网站,学习*后期制作的网站有哪些?  linux top下的 minerd 木马清除方法  如何做网站制作流程,*游戏网站怎么搭建?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  宝塔Windows建站如何避免显示默认IIS页面?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何通过远程VPS快速搭建个人网站?  建站之星3.0如何解决常见操作问题?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  微信h5制作网站有哪些,免费微信H5页面制作工具? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。