创建型:四. 工厂方法模式

工厂方法模式是什么

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

为什么用工厂方法模式

在新增一个产品时,不用去修改已有的代码。工厂方法将创建产品的代码与实际使用产品的代码分离,从而能在不影响其他代码的情况下扩展产品创建部分代码。例如,如果需要向应用中添加一种新产品,你只需要开发新的创建者子类,然后重写其工厂方法即可。

工厂方法模式怎么实现

factorymethod.go


package factorymethod

//Operator 是被封装的实际类接口
type Operator interface {
    SetA(int)
    SetB(int)
    Result() int
}

//OperatorFactory 是工厂接口
type OperatorFactory interface {
    Create() Operator
}

//OperatorBase 是Operator 接口实现的基类,封装公用方法
type OperatorBase struct {
    a, b int
}

//SetA 设置 A
func (o *OperatorBase) SetA(a int) {
    o.a = a
}

//SetB 设置 B
func (o *OperatorBase) SetB(b int) {
    o.b = b
}

minus_operator.go

package factorymethod

//MinusOperator Operator 的实际减法实现
type MinusOperator struct {
    *OperatorBase
}

//MinusOperatorFactory 是 MinusOperator 的工厂类
type MinusOperatorFactory struct{}

func (MinusOperatorFactory) Create() Operator {
    return &MinusOperator{
        OperatorBase: &OperatorBase{},
    }
}

//Result 获取结果
func (o MinusOperator) Result() int {
    return o.a - o.b
}

plus_operator.go

package factorymethod

//PlusOperator Operator 的实际加法实现
type PlusOperator struct {
    *OperatorBase
}

//PlusOperatorFactory 是 PlusOperator 的工厂类
type PlusOperatorFactory struct{}

func (PlusOperatorFactory) Create() Operator {
    return &PlusOperator{
        OperatorBase: &OperatorBase{},
    }
}

//Result 获取结果
func (o PlusOperator) Result() int {
    return o.a + o.b
}

example.go

package factorymethod

import "fmt"

func Example() {
    minus := new(MinusOperatorFactory).Create()
    minus.SetB(1)
    fmt.Println(minus.Result())
}

优点

  1. 你可以避免创建者和具体产品之间的紧密耦合。
  2. 单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
  3. 开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。

缺点

  1. 在添加新的产品的时候,会导致系统类的增加,从而增加了系统的复杂性和理解难度。
  2. 为了系统的可扩展型,引入了抽象层,增加了系统的抽象性,和理解难度。
posted @ 2022-04-04 17:14  EthanWell  阅读(102)  评论(0编辑  收藏  举报