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


本文摘自网络,作者,侵删。

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

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")

    }

}


本文来自:简书

感谢作者:bladeIII

查看原文:必须掌握的Golang23种设计模式之工厂方法模式

相关阅读 >>

Golang并发不是并行

Gocn酷Go推荐】Goroutine 泄漏防治神器 Goleak

Go cloud项目开源发布:Go语言将成为云端应用开发的首选语言?

Golang的zap怎么使用

聊聊storagetapper的pool

Go语言适合做哪些开发

难以遏制的人因差错 -Go 的日志工具之痛

.Go是什么文件

Go 为什么这么“快”

Golang中如何比较字符串是否相等

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...