简述
工厂模式(Factory Pattern)属于创建型模式,它通过将对象创建的逻辑封装起来,为使用者提供一个简单易用的对象创建接口。使用工厂模式的好处:
(1)代码可读性更好,通过工厂方法来封装对象的创建,可以通过函数名来表达代码含义,从而具备更好的的可读性
(2)与使用者代码解耦,通过工厂方法来封装对象的创建过程,可以在创建逻辑发生变更时,避免霰弹式修改
应用
不同条件下创建不同实例,例如:
- 根据不同环境读取不同配置文件
- 根据不同的条件访问不同的数据库mysql、MongoDB
实现
-
定义公共的接口(interface)
type *** interface {}
-
定义struct结构体,并实现公共的接口(interface)
-
定义工厂struct结构体并提供创建不同实例的方法,方法的返回值为interface类型
func (e *FactoryStructName) Create(params type) interfaceName
示例
定义工厂模式:
package factory
// 定义接口
type Event interface {
EventType() string
Content() string
}
// 定义 StartEvent 结构体
type StartEvent struct {
typeName string
content string
}
// StartEvent 结构体实现 Event 接口的 EventType 函数
func (e *StartEvent) EventType() string {
return e.typeName
}
// StartEvent 结构体实现 Event 接口的 Content 函数
func (e *StartEvent) Content() string {
return e.content
}
// 定义 EndEvent 结构体
type EndEvent struct {
typeName string
content string
}
// EndEvent 结构体实现 Event 接口的 EventType 函数
func (e *EndEvent) EventType() string {
return e.typeName
}
// EndEvent 结构体实现Event接口的 Content 函数
func (e *EndEvent) Content() string {
return e.content
}
// 定义工厂结构体
type Factory struct {
}
// 根据不同事件类型创建对象
func (e *Factory) Create(eventType string) Event {
switch eventType {
case "StartEvent":
return &StartEvent{
typeName: "start",
content: "开始事件",
}
case "EndEvent":
return &EndEvent{
typeName: "End",
content: "结束事件",
}
}
return nil
}
调用工厂模式:
package main
import (
"github.com/design/pattern/factory"
)
func main() {
// 工厂模式
factory :=factory.Factory{}
startEvent := factory.Create("StartEvent")
startEvent.Content()
}