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

bladeIII · · 535 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

535 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传