Go中Factory Method模式通过接口、函数类型和结构体组合实现,核心是将对象创建逻辑封装为可替换的工厂函数,调用方仅依赖接口,实现解耦与灵活扩展。

工厂模式在 Go 中不依赖继承和抽象类,而是通过接口、函数类型和结构体组合来实现。Factory Method 的核心是把“创建对象”的逻辑封装成可替换的函数或方法,让调用方无需关心具体类型,只面向接口编程。
先设计一个接口,作为所有具体产品的契约。比如我们想生成不同类型的日志记录器:
Logger 接口定义行为,不关心谁来实现它:
type Logger interface {
Log(message string)
}
每个具体类型都实现 Logger 接口,比如 ConsoleLogger、FileLogger、NetworkLogger:
type ConsoleLogger struct{}
func (c *ConsoleLogger) Log(message string) {
fmt.Println("[CONSOLE]", message)
}
type FileLogger struct {
filename string
}
func (f *FileLogger) Log(message string) {
fmt.Printf("[FILE %s] %s\n", f.filename, message)
}
Go 用函数类型模拟“创建方法”。声明一个工厂函数类型,再为每种产品提供对应的工厂函数:
腾讯AI 开放平台
腾讯AI开放平台
381
查看详情
type LoggerFactory func() Logger
var (
ConsoleLoggerFactory LoggerFactory = func() Logger { return &ConsoleLogger{} }
FileLoggerFactory LoggerFactory = func(filename string) Logger {
return &FileLogger{filename: filename}
}
)
更灵活的做法是把参数通过闭包捕获,让工厂函数保持无参签名:
func NewFileLoggerFactory(filename string) LoggerFactory {
return func() Logger {
return &FileLogger{filename: filename}
}
}
func NewNetworkLoggerFactory(addr string) LoggerFactory {
return func() Logger {
return &NetworkLogger{addr: addr}
}
}
业务代码只依赖 LoggerFactory 类型,运行时注入不同工厂,轻松切换实现:
func RunWithLogger(factory LoggerFactory) {
logger := factory() // 调用工厂方法,得到具体实例
logger.Log("Application started")
}
// 使用示例
RunWithLogger(ConsoleLoggerFactory)
RunWithLogger(NewFileLoggerFactory("app.log"))
RunWithLogger(NewNetworkLoggerFactory("127.0.0.1:9000"))
也可以把工厂注册到 map 或配置中,按名称动态选择:
var logFactories = map[string]LoggerFactory{
"console": ConsoleLoggerFactory,
"file": NewFileLoggerFactory("log.txt"),
"network": NewNetworkLoggerFactory("logs.example.com:8080"),
}
func CreateLogger(kind string) (Logger, error) {
factory, ok := logFactories[kind]
if !ok {
return nil, fmt.Errorf("unknown logger type: %s", kind)
}
return factory(), nil
}
基本上就这些。Go 的 Factory Method 不靠语言特性,靠
的是函数一等公民 + 接口组合 + 显式依赖传递。清晰、轻量、测试友好。
以上就是如何使用Golang实现工厂模式_使用Factory Method动态生成对象的详细内容,更多请关注其它相关文章!
# 中文网
# 外贸推广网站建设流程
# 营销方案线下推广模板
# 淘宝电商群怎样做营销推广
# seo优化学校
# 网站链接优化策略
# 北京网站建设大作业
# 学网站建设的软件
# 英国简历优化推荐网站
# seo全网营销推广代发
# 重庆seo营销培训班
# 解决问题
# go
# 相关文章
# 如何在
# 多个
# 记录器
# 的是
# 布尔
# 如何使用
# 腾讯
# app
# golang
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
驱动人生:游戏修复指南
使用document.execCommand实现Web文本编辑器加粗/取消加粗
PDF文件去水印平台入口 PDF水印删除网址
优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理
优化Google Charts Gauge:在数据库无数据时显示默认值
荣耀Magic7拍照夜景噪点处理_荣耀Magic7相机优化
PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角
Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践
J*aScript大数运算_BigInt使用指南
教育查询官方网站入口 教育个人档案查询免费官网
yandex网页版直接登录 yandex官方入口平台访问方法
C++如何实现单例模式_C++线程安全的单例模式写法
《植物大战僵尸3》火龙草作用介绍
《浙里办》电子发票开具方法
在Django中动态检查模型关联:一种灵活的解决方案
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
CSS布局中意外顶部空白的调试与解决:深入理解padding-top
有道AI翻译入口 智能写作官方网站入口
TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法
顺丰快递收费标准查询_如何查看顺丰最新收费价格
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
火柴人战争网页版在线玩
Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制
在Django单元测试中优雅处理信号:基于环境的条件执行策略
免费占卜在线神算_免费占卜手机神算
Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置
《火花chat》搜索好友方法
喜茶GO更换登录账号方法
《撕歌》会员开通方法
学习通网页版个人登录_学习通网页版个人账户登录入口
word表格如何按某一列内容进行排序_Word表格按列排序方法
Golang如何初始化module项目_Golang module init使用说明
如何在vscode中关闭it环境
微信如何设置字体大小_微信字体设置的阅读舒适
win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】
Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】
微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态
谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问
在PySimpleGUI中实现键盘按键绑定按钮事件
鸣潮历史学家灯塔位置一览
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
Leaflet地图弹出窗口图片动态显示:避免缺失图标的专业指南
sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码
谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接
《随手记》备份数据方法
苹果手机缓存怎么清除_苹果手机缓存如何清除iphone各版本操作步骤
如何使用 composer 和 aop-php 实现 AOP 编程?
如何在解析前预检查XML文件的完整性? 比如检查文件大小或特定结束标签
realme 10 Pro息屏方案_realme 10 Pro省电策略
为什么XML解析器对大小写敏感? 理解XML规范中的大小写规则与最佳实践
2025-12-09
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。