首页 > 后端开发 > Golang > 正文

Golang工厂模式与依赖注入结合实践

P粉602998670
发布: 2025-09-10 10:09:01
原创
305人浏览过
工厂模式封装对象创建,依赖注入实现解耦。通过工厂生成Logger实例,由DI将依赖注入UserService,主函数负责装配,结合两者提升可维护性与测试性,扩展时不改业务代码。

golang工厂模式与依赖注入结合实践

在Go语言开发中,工厂模式与依赖注入(DI)的结合能有效提升代码的可维护性与可测试性。通过工厂创建对象,再借助依赖注入管理组件之间的依赖关系,可以让程序结构更清晰,降低耦合度。下面从实际场景出发,介绍如何将两者结合使用。

工厂模式解决对象创建问题

当系统中存在多种类型的服务或组件,且创建逻辑较复杂时,直接在业务代码中初始化会导致重复和紧耦合。工厂模式封装了对象的创建过程。

例如,我们有一个日志接口,支持不同实现:

type Logger interface {
    Log(msg string)
}

type FileLogger struct{}

func (f *FileLogger) Log(msg string) {
    fmt.Println("File log:", msg)
}

type ConsoleLogger struct{}

func (c *ConsoleLogger) Log(msg string) {
    fmt.Println("Console log:", msg)
}
登录后复制

通过工厂来决定返回哪种日志实现:

立即学习go语言免费学习笔记(深入)”;

type LoggerFactory struct{}

func (f *LoggerFactory) Create(loggerType string) Logger {
    switch loggerType {
    case "file":
        return &FileLogger{}
    case "console":
        return &ConsoleLogger{}
    default:
        return &ConsoleLogger{}
    }
}
登录后复制

依赖注入实现组件解耦

有了工厂后,不应让业务模块直接调用工厂创建实例。而是通过依赖注入,将构建好的对象传递进去,避免模块感知创建逻辑。

比如一个用户服务依赖日志器:

type UserService struct {
    logger Logger
}

func NewUserService(logger Logger) *UserService {
    return &UserService{logger: logger}
}

func (s *UserService) Register(name string) {
    s.logger.Log("User registered: " + name)
}
登录后复制

构造函数接收 Logger 接口,而不是内部自己 new 或调用工厂。这正是依赖注入的核心:由外部提供依赖。

依图语音开放平台
依图语音开放平台

依图语音开放平台

依图语音开放平台 6
查看详情 依图语音开放平台

组合工厂与依赖注入的初始化流程

真正的结合体现在应用启动阶段。在这个阶段,先通过工厂创建具体实例,然后注入到需要它的服务中。

主函数或初始化模块负责“装配”:

func main() {
    factory := &LoggerFactory{}
    logger := factory.Create("console") // 或从配置读取

    userService := NewUserService(logger)

    userService.Register("Alice")
}
登录后复制

这种方式下,UserService 完全不知道日志是如何创建的,只关心它能用。如果未来要加数据库日志,只需扩展工厂,不改业务代码。

进阶:使用依赖注入框架简化管理

当项目变大,手动管理依赖会变得繁琐。可以引入轻量级DI库如 google/wireuber/fx 来自动化装配。

以 Wire 为例,定义 Provider 集合:

func ProvideLogger() Logger {
    factory := &LoggerFactory{}
    return factory.Create("file")
}

func ProvideUserService() *UserService {
    return NewUserService(ProvideLogger())
}
登录后复制

Wire 在编译期生成注入代码,性能好且无运行时反射开销。

基本上就这些。工厂模式负责“造什么”,依赖注入决定“怎么给”。两者配合,让Go程序在保持简洁的同时具备良好的扩展性与测试便利性。不复杂但容易忽略。

以上就是Golang工厂模式与依赖注入结合实践的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号