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 对象,而是接收工厂实例(推荐构造函数注入):
立即学习“go语言免费学习笔记(深入)”;
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 才算落地。










