美文网首页
必须掌握的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