设计模式之golang实现-简单工厂模式

最近玩了一段时间的golang之后想着练练手,想着以前看过大话设计模式,就想着实现一下。

 

package easyfactory

import "errors"

type operation struct {
}

type cal interface {
	cal(int, int) (float64, error)
}

type operationAdd struct {
	operation
}

func (o *operationAdd) cal(num1, num2 int) (float64, error) {
	return float64(num1 + num2), nil
}

type operationMinus struct {
	operation
}

func (o *operationMinus) cal(num1 int, num2 int) (float64, error) {
	return float64(num1 - num2), nil
}

type operationMulti struct {
	operation
}

func (o *operationMulti) cal(num1 int, num2 int) (float64, error) {
	return float64(num1 * num2), nil
}

type operationDiv struct {
	operation
}

func (o *operationDiv) cal(num1, num2 int) (float64, error) {
	if num2 == 0 {
		return 0, errors.New("除法运算中除数不能为0")
	}
	return float64(num1 / num2), nil
}

type operationFactory struct{}

func (o *operationFactory) createOperation(op string) cal {
	switch op {
	case "+":
		return new(operationAdd)
	case "-":
		return new(operationMinus)
	case "*":
		return new(operationMulti)
	case "/":
		return new(operationDiv)
	}
	return nil
}
package easyfactory

import "testing"

func TestOperation(t *testing.T) {
	var factory operationFactory
	ent := factory.createOperation("+")
	if got, _ := ent.cal(1, 2); got != 3 {
		t.Errorf("cal(1,2)=%v, want %v", got, 3)
	}
}

 

 

 

 

 

 

 

 

 

思考:

1.简单工厂模式把运算类的实例化封装起来了,避免了业务代码中硬编码实例化,这样的好处是如果我们的计算类比如加计算类名称更改不需要到处找哪里使用了加计算类,

只需要在工厂方法中修改一处即可。

2.通过测试包可以看出整个功能的实现需要通过工厂类获取具体的运算类,调用运算类的cal方法。

3.简单工厂模式破坏了开闭原则,比如我们新增一个平方运算,需要修改工厂类的createOperation方法。

阿里云双十一云服务器拼团活动,已经打到最低价99元一年!有需要的可以考虑一波了!

https://m.aliyun.com/act/team1111/#/share?params=N.9g4CZ2TwSh.qilw7y0a

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值