最近玩了一段时间的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