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

Insou AI
Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。
下载
<p>用 Go 实现 MVC + 工厂模式,核心是让控制器(Controller)不直接 new 视图(View)或模型(Model),而是通过工厂统一创建和组装,从而解耦业务逻辑与界面构造。</p>
<H3>1. 定义清晰的 MVC 接口契约</H3>
<p>先抽象出各层接口,避免具体类型泄漏:</p>
<ul>
<li><strong>Model</strong>:定义数据操作方法,如 <code>GetUser(id int) (*User, error)</code></li>
<li><strong>View</strong>:定义渲染方法,如 <code>Render(data interface{}) ([]byte, error)</code></li>
<li><strong>Controller</strong>:只依赖 Model 和 View 接口,不关心实现;处理请求、调用 Model、传参给 View</li>
</ul>
<H3>2. 创建工厂接口及具体实现</H3>
<p>工厂负责按需生成 Model/View 实例,支持切换实现(如 HTML vs JSON 视图):</p>
<ul>
<li>定义 <code>ViewFactory</code> 接口:<code>CreateView(viewType string) View</code></li>
<li>实现 <code>HTMLViewFactory</code>:返回基于 <code>html/template</code> 的视图</li>
<li>定义 <code>ModelFactory</code> 接口:<code>CreateUserModel() UserModel</code></li>
<li>可结合配置或上下文(如 HTTP header)动态决定返回哪种 View</li>
</ul>
<H3>3. Controller 通过依赖注入使用工厂</H3>
<p>Controller 不自己 new 对象,而是接收工厂实例(推荐构造函数注入):</p>
<pre><code>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)
}</code></pre>
<H3>4. 启动时组装依赖链(DI 容器雏形)</H3>
<p>main 函数里集中初始化并连接各层,体现“控制反转”:</p>
<ul>
<li>新建 <code>HTMLViewFactory{}</code> 和 <code>DBUserModelFactory{db: dbConn}</code></li>
<li>用它们创建 <code>UserController</code></li>
<li>注册到 HTTP 路由:<code>http.HandleFunc("/user/", uc.Show)</code></li>
<li>后续替换 JSON 视图?只需换一个 <code>CreateView("json")</code> 实现,Controller 代码零修改</li>
</ul>
<p>不复杂但容易忽略:工厂本身也应面向接口设计,避免在 Controller 中出现 switch-type 或硬编码 new。真正把“谁来创建”和“谁来使用”分开,MVC 才算落地。</p>