通八洲科技

如何使用Golang实现MVC+工厂模式_分离业务逻辑和视图创建

日期:2025-12-25 00:00 / 作者:P粉602998670
Go中MVC+工厂模式的核心是控制器通过工厂接口创建模型和视图,实现解耦;需定义各层接口、工厂接口及实现、依赖注入控制器、启动时组装依赖链,确保可替换性与可维护性。

用 Go 实现 MVC + 工厂模式,核心是让控制器(Controller)不直接 new 视图(View)或模型(Model),而是通过工厂统一创建和组装,从而解耦业务逻辑与界面构造。

1. 定义清晰的 MVC 接口契约

先抽象出各层接口,避免具体类型泄漏:

  • Model:定义数据操作方法,如 GetUser(id int) (*User, error)
  • View:定义渲染方法,如 Render(data interface{}) ([]byte, error)
  • Controller:只依赖 Model 和 View 接口,不关心实现;处理请求、调用 Model、传参给 View

2. 创建工厂接口及具体实现

工厂负责按需生成 Model/View 实例,支持切换实现(如 HTML vs JSON 视图):

  • 定义 ViewFactory 接口:CreateView(viewType string) View
  • 实现 HTMLViewFactory:返回基于 html/template 的视图
  • 定义 ModelFactory 接口:CreateUserModel() UserModel
  • 可结合配置或上下文(如 HTTP header)动态决定返回哪种 View

3. Controller 通过依赖注入使用工厂

Controller 不自己 new 对象,而是接收工厂实例(推荐构造函数注入):

type UserController struct {
    modelFactory ModelFactory
    viewFactory  ViewFactory
}

func NewUserController(mf ModelFactory, vf ViewFactory) *UserController {
    return &UserController{modelFactory: mf, viewFactory: vf}
}

func (uc *UserController) Show(w http.ResponseWriter, r *http.Request) {
    id := parseID(r)
    user, err := uc.modelFactory.CreateUserModel().GetByID(id)
    if err != nil {
        http.Error(w, "not found", http.StatusNotFound)
        return
    }
    view := uc.viewFactory.CreateView("user_detail_html")
    data, _ := view.Render(user)
    w.Header().Set("Content-Type", "text/html")
    w.Write(data)
}

4. 启动时组装依赖链(DI 容器雏形)

main 函数里集中初始化并连接各层,体现“控制反转”:

  • 新建 HTMLViewFactory{}DBUserModelFactory{db: dbConn}
  • 用它们创建 UserController
  • 注册到 HTTP 路由:http.HandleFunc("/user/", uc.Show)
  • 后续替换 JSON 视图?只需换一个 CreateView("json") 实现,Controller 代码零修改

不复杂但容易忽略:工厂本身也应面向接口设计,避免在 Controller 中出现 switch-type 或硬编码 new。真正把“谁来创建”和“谁来使用”分开,MVC 才算落地。