美文网首页
必须掌握的Golang23种设计模式之工厂方法模式

必须掌握的Golang23种设计模式之工厂方法模式

作者: bladeIII | 来源:发表于2021-07-07 12:53 被阅读0次

工厂方法模式使用子类的方式延迟生成对象到子类中实现。

Go中不存在继承 所以使用匿名组合来实现

查看全部设计模式:http://www.golang.ren/article/6477

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

}

//PlusOperatorFactory 是 PlusOperator 的工厂类

type PlusOperatorFactory struct{}

func (PlusOperatorFactory) Create() Operator {

    return &PlusOperator{

        OperatorBase: &OperatorBase{},

    }

}

//PlusOperator Operator 的实际加法实现

type PlusOperator struct {

    *OperatorBase

}

//Result 获取结果

func (o PlusOperator) Result() int {

    return o.a + o.b

}

//MinusOperatorFactory 是 MinusOperator 的工厂类

type MinusOperatorFactory struct{}

func (MinusOperatorFactory) Create() Operator {

    return &MinusOperator{

        OperatorBase: &OperatorBase{},

    }

}

//MinusOperator Operator 的实际减法实现

type MinusOperator struct {

    *OperatorBase

}

//Result 获取结果

func (o MinusOperator) Result() int {

    return o.a - o.b

}

factorymethod_test.go

package factorymethod

import "testing"

func compute(factory OperatorFactory, a, b int) int {

    op := factory.Create()

    op.SetA(a)

    op.SetB(b)

    return op.Result()

}

func TestOperator(t *testing.T) {

    var (

        factory OperatorFactory

    )

    factory = PlusOperatorFactory{}

    if compute(factory, 1, 2) != 3 {

        t.Fatal("error with factory method pattern")

    }

    factory = MinusOperatorFactory{}

    if compute(factory, 4, 2) != 2 {

        t.Fatal("error with factory method pattern")

    }

}

相关文章

网友评论

      本文标题:必须掌握的Golang23种设计模式之工厂方法模式

      本文链接:https://www.haomeiwen.com/subject/iquoultx.html