必须掌握的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种设计模式之工厂方法模式

相关阅读 >>

Go语言 break 语句

Go那些事之helloworld结构

关于Golang slice的append扩容

手撸Golang 基本数据结构与算法 堆

Golang context用来干吗

基于原论文,我实现了一个更全面的布谷鸟过滤器

08 Golang引用类型——切片

Golang一行代码把array/slice转成逗号分隔的字符串

Golang怎么判断slice是否为空

Go中sync.mutex源码解读

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




打赏

取消

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

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

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

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

评论

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