工厂方法模式(Factory Method Pattern)

195 阅读2分钟

简述

工厂模式(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()
}