如何使用Golang实现简单工厂模式_封装对象创建逻辑


简单工厂模式虽非GoF 23种设计模式之一,但通过接口定义行为、结构体实现具体逻辑、工厂函数统一创建并返回接口实例,实现了对象创建逻辑的封装与解耦。

如何使用golang实现简单工厂模式_封装对象创建逻辑

简单工厂模式不是GoF 23种设计模式之一,但它是一种实用的封装对象创建逻辑的方式。Golang没有类和构造函数,但可以通过函数、结构体和接口自然实现类似效果——核心是把“创建什么类型”的判断逻辑集中到一个工厂函数中,对外隐藏具体类型和初始化细节。

定义统一接口,让不同实现可互换

先定义一个接口,描述所有产品共有的行为。比如做一个日志记录器工厂,支持控制台、文件、网络三种输出方式:

log.go

type Logger interface {
  Log(message string)
}

实现具体类型,各自封装内部逻辑

每个具体日志器实现 Logger 接口,内部处理各自的写入方式:

console_logger.go

标贝AI虚拟主播 标贝AI虚拟主播

一站式虚拟主播视频生产和编辑平台

标贝AI虚拟主播 69 查看详情 标贝AI虚拟主播 type ConsoleLogger struct{}

func (c *ConsoleLogger) Log(message string) {
  fmt.Println("[CONSOLE]", message)
}

file_logger.go

type FileLogger struct {
  filename string
}

func NewFileLogger(filename string) *FileLogger {
  return &FileLogger{filename: filename}
}

func (f *FileLogger) Log(message string) {
  f.writeToFile(message) // 省略具体写入逻辑
}

编写工厂函数,统一管理创建逻辑

工厂函数接收参数(如类型名或配置),返回接口类型实例。调用方不关心具体结构体,只依赖 Logger 接口:

logger_factory.go

type LoggerType string

const (
  ConsoleLoggerType LoggerType = "console"
  FileLoggerType LoggerType = "file"
  NetworkLoggerType LoggerType = "network"
)

func NewLogger(loggerType LoggerType, config map[string]string) Logger {
  switch loggerType {
  case ConsoleLoggerType:
    return &ConsoleLogger{}
  case FileLoggerType:
    return NewFileLogger(config["filename"])
  case NetworkLoggerType:
    return &NetworkLogger{addr: config["addr"]}
  default:
    return &ConsoleLogger{} // 默认兜底
  }
}

使用时只需调用工厂,解耦创建与使用

业务代码不再 new 具体类型,而是通过工厂获取实例,后续扩展新日志器也不影响原有调用:

func main() {
  logger := NewLogger(ConsoleLoggerType, nil)
  logger.Log("Hello from console")

  fileLogger := NewLogger(FileLoggerType, map[string]string{"filename": "app.log"})
  fileLogger.Log("S*ed to file")
}
  • 新增日志器只需实现 Logger 接口 + 在工厂中加 case 分支
  • 调用方无感知变化,无需修改 import 或初始化语句
  • 配置可灵活传入(如 map、struct、option 函数),提升扩展性

以上就是如何使用Golang实现简单工厂模式_封装对象创建逻辑的详细内容,更多请关注其它相关文章!


# golang  # 义乌市网站建设服务器  # 成本最低的网站建设方案  # 店铺最多的网站排名优化  # 顺义优化seo  # 排名网站怎么优化软件  # 高碑店医院网站建设招标  # 禹州seo排名  # 怎么注册作文网站推广  # 修武县网站推广公司地址  # 可以通过  # 相关文章  # 记录器  # 是一种  # 也不  # 不同类型  # 布尔  # 只需  # 如何使用  # 主播  # 简单工厂模式  # switch  # ai  # app  # go  # seo 推广表格 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Win10通知横幅停留时间修改 Win10自定义通知显示时长【技巧】  《糖豆》添加舞曲方法  我的世界官方网址入口 我的世界游戏主页直达入口  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  qq邮箱怎么注册_QQ邮箱注册步骤与注意事项  在VS Code中利用AI辅助进行代码迁移  韩小圈网页版PC端入口 韩小圈网页版官方网站入口  《饿了么》拼好饭点外卖教程2025  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  百度识图图像分析 百度识图识别平台  b站网页版入口 哔哩哔哩官方网站直接进入  使用VS Code作为你的个人知识管理系统  构建可配置的J*aScript加权点击计数器与共享总计功能  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  《绿竹漫游》关闭消息通知方法  如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计  《王者荣耀世界》英雄获取攻略  Win11如何分屏操作_Win11多窗口分屏技巧  C++ static关键字作用_C++静态成员变量与静态函数  《土豆雅思》修改密码方法  优化Google Charts Gauge:在数据库无数据时显示默认值  申通快递查询 申通物流快递单实时查询入口  TikTok网页版入口快速访问 TikTok官网账号登录方法  Composer如何使用composer-plugin-api开发自定义插件  太平年在哪个平台播出  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  修复UI元素交互障碍:从“开始”按钮到信息框的平滑过渡实现  Mac怎么关闭按键声音_Mac键盘打字音效设置  Python中安全地将环境变量转换为整数的类型注解指南  AO3中文版手机快速通道_AO3最新稳定链接更新  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  重返未来:1999卡戎全方位攻略  PPT智能排版生成入口 免费PPT内容自动生成平台  word文档行距怎么调?word文档调行距的操作步骤  《荔枝fm》导出文件教程  苹果自助维修计划支持哪些设备机型  微信步数怎么刷_微信步数快速提升技巧  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  4399正版网页版入口高清直达链接  《广发易淘金》国债逆回购操作教程  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  《地下城堡4:骑士与破碎编年史》墓穴挑战125攻略  键盘声音异常怎么回事_键盘异响怎么处理  Symfony路由参数转换器:实体存在性验证与错误处理策略  AO3官方镜像链接 | 最新防走失网址永久收藏  《下一站江湖2》风神腿获取攻略  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法  抖音猜你想搜能说明对方搜过吗 

 2025-12-20

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.