新闻中心
如何在Golang中实现建造者模式与工厂模式结合_Golang设计模式复合应用
Go中建造者与工厂模式结合:工厂封装创建入口并分发类型,建造者控制构造细节,支持链式配置与Build组装,职责分离且易于扩展。

在 Go 语言中,建造者模式与工厂模式结合使用,核心在于用工厂封装对象创建入口,用建造者控制复杂对象的构造过程。这种组合既保持了创建逻辑的解耦,又支持灵活配置和可读性强的实例化方式。
工厂负责类型分发,建造者负责细节组装
工厂不直接 new 结构体,而是返回一个建造者实例;建造者提供链式方法设置字段,并最终调用 Build() 得到目标对象。这样,不同产品类型(如 User、Admin、Guest)可由不同工厂返回专属建造者,而每个建造者内部管理自己的字段校验、默认值、依赖注入等逻辑。
- 工厂接口定义 CreateBuilder() 方法,返回 Builder 接口
- 每种具体产品(如 MySQLConnection、PostgreSQLConnection)有对应的具体建造者
- 建造者实现 SetXXX() 链式方法 + Build() 方法,Build 中做合法性检查和对象组装
用泛型简化建造者接口(Go 1.18+)
避免为每种类型重复定义 Builder 接口,可用泛型统一抽象:
type Builder[T any] interface {
Build() (*T, error)
}
再配合具体类型实现,例如:
type UserBuilder struct {
name string
email string
role string
}
func (b *UserBuilder) Name(n string) *UserBuilder { b.name = n; return b }
func (b *UserBuilder) Email(e string) *UserBuilder { b.email = e; return b }
func (b *UserBuilder) Role(r string) *UserBuilder { b.role = r; return b }
func (b *UserBuilder) Build() (*User, error) {
if b.name == "" || b.email == "" {
return nil, errors.New("name and email required")
}
return &User{Name: b.name, Email: b.email, Role: b.role}, nil
}
工厂根据参数动态返回合适建造者
工厂可基于配置、环境变量或运行时参数决定返回哪种建造者:
简小派
简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。
123
查看详情
- 比如 NewDatabaseFactory().CreateBuilder("mysql") → MySQLBuilder{}
- 或 NewUserFactory().CreateBuilder(UserTypeAdmin) → AdminUserBuilder{}
- 工厂本身可实现为结构体,携带共享依赖(如 logger、config),供各建造者复用
实际调用简洁清晰,语义明确
使用者无需关心对象内部结构或初始化顺序,只需按需配置后构建:
user := NewUserFactory().
CreateBuilder().
Name("Alice").
Email("alice@example.com").
Role("admin").
Build()
db := NewDatabaseFactory().
CreateBuilder("postgres").
Host("localhost").
Port(5432).
Build()
这种写法天然支持单元测试(可 mock 工厂返回测试用建造者),也便于后期扩展新类型(只需新增工厂分支和建造者实现,不修改已有代码)。
基本上就这些。关键不在语法多炫,而在职责分得清:工厂管“造谁”,建造者管“怎么造”。两者一搭,复杂对象创建就稳了。
以上就是如何在Golang中实现建造者模式与工厂模式结合_Golang设计模式复合应用的详细内容,更多请关注其它相关文章!
# 而在
# 可站内营销推广方案
# 宁德网站优化去哪找
# 体育中心推广营销方案
# 重庆抖音房产seo
# 福山哪家网站推广好
# seo关键词排名火一星24惠
# 网站建设优化推荐
# 网站建设方案模板图片
# 市场营销推广活动建议和意见
# 官方打击seo
# 中文网
# 相关文章
# mysql
# 已有
# 自己的
# 查询结果
# 如何在
# 只需
# 绑定
# 链式
# red
# 环境变量
# ai
# golang
# go
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
J*aScript中赋值与自增运算符的复杂交互与执行机制
照顾宝贝2小游戏点击立即在线玩
Excel Power Pivot如何处理XML数据源 构建高级数据模型
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
在哪找SublimeJ远程工具_SFTP插件配置教程
谷歌推RCS信息存档功能:公司可监控员工私密信息!
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
Kafka Streams中基于消息头条件过滤消息的实现指南
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
Golang如何使用new_Go new分配内存机制讲解
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
CSS Box Model与弹性按钮:维持布局稳定的动画实践
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录
Centos/Linux 系统下安装 composer 的完整步骤
知音漫客官网漫画下载_知音漫客网页版阅读记录
UC浏览器网页版登录入口官网 电脑版网址入口
曝R星经典之作开发图 设计简陋但信息密集!
响应式容器内容自动缩放与宽高比维持教程
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
j*a toString()的覆盖
免费抖音短视频入口_抖音网页版短视频免费通道
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
J*a递归快速排序中静态变量的状态管理与陷阱
C#中解析不规范的HTML为XML 常见的坑与解决办法
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
在Socket.IO连接中实现Access Token自动更新与动态重连
XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法
DLsite中文平台入口 DLsite官网内容在线查看
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
qq游戏手机版下载安装_qq游戏移动端入口
excel怎么制作工资条 excel快速生成工资条的方法
海棠电脑版入口_通过电脑访问海棠官网阅读
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
微信聊天记录怎么加密_微信聊天记录加密方法
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
智慧团建扫码登录入口 智慧团建扫码登录入口官网版
提升Kafka消费者健壮性:会话超时处理与消息处理语义
J*aScript map 方法中处理循环元素为空数组的策略
在Pyomo中实现基于变量的条件约束:Big-M方法详解
J*a实现学校排课程序_面向对象结构化项目示例
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染


2025-12-06
浏览次数:次
返回列表