工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
工厂方法模式的优势:
-
封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。
-
代码复用:创建代码抽离到独立的工厂类之后可以复用。
-
隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。
-
控制复杂度:将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。
下面是实例代码:
package main
import (
"fmt"
)
type dialog interface {
render()
onClick()
}
type dialogFactory interface {
newDialog() dialog
}
type windowDialog struct{}
func (w *windowDialog) render() {
fmt.Println("render windowDialog")
}
func (w *windowDialog) onClick() {
fmt.Println("on click windowDialog")
}
type windowDialogFactory struct{}
func newWindowDialogFactory() dialogFactory {
return &windowDialogFactory{}
}
func (f *windowDialogFactory) newDialog() dialog {
return &windowDialog{}
}
func newDialogFactory(factoryName string) dialogFactory {
switch factoryName {
case "windowDialog":
return newWindowDialogFactory()
default:
return nil
}
}
func main() {
f := newDialogFactory("windowDialog")
w := f.newDialog()
w.render()
w.onClick()
}
从上面的代码可以看出,工厂方法模式的主要特点是: 通过工厂来创建子工厂,子工厂创建实例对象。