需求
实现一个计算器
UML图
代码
运算接口
type Operation interface {
GetResult() float64
}
加减乘除实现类
后续有扩展的计算方法,只需要实现Operation接口的GetResult()方法即可
type Number struct {
numberA float64
numberB float64
}
//加
type OperationAdd struct {
Number
}
func (o *OperationAdd) GetResult() float64 {
return o.numberA + o.numberB
}
//减
type OperationSub struct {
Number
}
func (o *OperationSub) GetResult() float64 {
return o.numberA - o.numberB
}
//乘
type OperationMul struct {
Number
}
func (o *OperationMul) GetResult() float64 {
return o.numberA * o.numberB
}
//除
type OperationDiv struct {
Number
}
func (o *OperationDiv) GetResult() float64 {
if o.numberB == 0 {
panic("除数不能为0")
}
return o.numberA / o.numberB
简单工厂类
package simpleFactory
type OperationFactory struct {
}
func (f *OperationFactory) CreateOperation(numberA, numberB float64, operate string) Operation {
var operation Operation
switch operate {
case "+":
operation = &OperationAdd{Number{numberA: numberA, numberB: numberB}}
break
case "-":
operation = &OperationSub{Number{numberA: numberA, numberB: numberB}}
break
case "*":
operation = &OperationMul{Number{numberA: numberA, numberB: numberB}}
break
case "/":
operation = &OperationDiv{Number{numberA: numberA, numberB: numberB}}
break
default:
panic("do not support")
}
return operation
}
测试
func main() {
//简单工厂模式
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
}()
var oper simpleFactory.Operation
factory := new(simpleFactory.OperationFactory)
oper = factory.CreateOperation(2, 2, "*")
fmt.Println(oper.GetResult())
}