Go通过接口+结构体+函数值实现工厂与适配器模式:定义Logger接口统一契约,ZapLoggerAdapter和FileWriterAdapter等适配异构日志组件,NewLogger工厂按配置创建对应实例,解耦创建逻辑与具体类型。
用 Go 实现工厂 + 适配器模式,核心是解耦对象创建逻辑与具体类型,同时让不兼容的接口“变相”符合统一契约。Go 没有类和继承,但靠接口(interface)+ 结构体(struct)+ 函数值,完全可以达成相同设计意图。
先确定对外暴露的抽象能力——比如一个通用的 Logger 接口:
type Logger interface {
Log(msg string)
}
所有日志实现都必须满足这个契约,后续才能被统一使用。
现实里你可能已有第三方日志库(如 zap.Logger)或旧系统模块(如自定义 FileWriter),它们类型不同、方法名不同、参数也不同。这时就需要适配器:
zap.Logger,把 Info() 映射为 Log()
WriteLine(string) 封装成 Log(string)
type ZapLoggerAdapter struct {
logger *zap.Logger
}
func (a *ZapLoggerAdapter) Log(msg string) {
a.logger.Info(msg)
}
type FileWriterAdapter struct {
file *os.File
}
func (a *FileWriterAdapter) Log(msg string) {
a.file.WriteString(msg + "\n")
}
避免调用方感知底层类型差异,提供一个配置驱动的工厂函数:
type LoggerType string
const (
ConsoleLogger LoggerType = "console"
FileLogger LoggerType = "file"
ZapLogger LoggerType = "zap"
)
func NewLogger(t LoggerType, cfg interface{}) (Logger, error) {
switch t {
case ConsoleLogger:
return &ConsoleLoggerImpl{}, nil
case FileLogger:
if path, ok := cfg.(string); ok {
f, err := os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil, err
}
return &FileWriterAdapter{file: f}, nil
}
case ZapLogger:
z, err := zap.NewDevelopment()
if err != nil {
return nil, err
}
return &ZapLoggerAdapter{logger: z}, nil
}
return nil, fmt.Errorf("unknown logger type: %s", t)
}
调用时只需传入类型和配置,完全不关心内部结构是否带 zap 或 os.File:
logger, _ := NewLogger(FileLogger, "/tmp/app.log")
logger.Log("service started") // 统一调用
如果某些老模块只提供函数而非结构体(比如一个全局 func PrintToDB(string)),也可适配:
type FuncLoggerAdapter struct {
fn func(string)
}
func (a *FuncLoggerAdapter) Log(msg string) {
a.fn(msg)
}
// 工厂中支持:
case "db":
return &FuncLoggerAdapter{fn: PrintToDB}, nil
Go 的函数是一等公民,这种轻量适配非常自然,无需额外 wrapper 类。
不复杂但容易忽略:适配器本身不新增功能,只做“翻译”;工厂不持有实例状态,保持无副作用。两者配合,就能在不改旧代码的前提下,让新系统平滑接入各种异构组件。
# go
# golang
# app
# switch
# String
# 封装
# 结构体
# 继承
# 接口
# Struct
# Interface
# 对象
# 异构
# 已有
# 只需
# 也可
# 能在
# 自定义
# 可选
# 而非
# 提供一个
# 第三方
相关文章:
如何通过VPS建站实现广告与增值服务盈利?
制作网页的网站有哪些,电脑上怎么做网页?
建站主机与服务器功能差异如何区分?
实例解析angularjs的filter过滤器
平台云上自助建站如何快速打造专业网站?
TestNG的testng.xml配置文件怎么写
c# 服务器GC和工作站GC的区别和设置
如何快速搭建高效WAP手机网站吸引移动用户?
制作营销网站公司,淘特是干什么用的?
php json中文编码为null的解决办法
建站之星代理如何获取技术支持?
高防服务器:AI智能防御DDoS攻击与数据安全保障
网站制作话术技巧,网站推广做的好怎么话术?
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何在服务器上配置二级域名建站?
公司网站的制作公司,企业网站制作基本流程有哪些?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
企业微网站怎么做,公司网站和公众号有什么区别?
如何在宝塔面板中创建新站点?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何破解联通资金短缺导致的基站建设难题?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
定制建站流程解析:需求评估与SEO优化功能开发指南
韩国服务器如何优化跨境访问实现高效连接?
,怎么在广州志愿者网站注册?
电商网站制作公司有哪些,1688网是什么意思?
如何在万网主机上快速搭建网站?
如何在香港服务器上快速搭建免备案网站?
PHP 500报错的快速解决方法
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
定制建站是什么?如何实现个性化需求?
建站之星如何实现PC+手机+微信网站五合一建站?
济南企业网站制作公司,济南社保单位网上缴费步骤?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何在香港免费服务器上快速搭建网站?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
如何在搬瓦工VPS快速搭建网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何正确下载安装西数主机建站助手?
宝塔新建站点为何无法访问?如何排查?
如何通过免费商城建站系统源码自定义网站主题与功能?
,柠檬视频怎样兑换vip?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
已有域名和空间如何快速搭建网站?
魔方云NAT建站如何实现端口转发?
代购小票制作网站有哪些,购物小票的简要说明?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
*请认真填写需求信息,我们会在24小时内与您取得联系。