go语言实现设计模式(二):简易工厂

  • 2019 年 11 月 21 日
  • 筆記

简易工厂主要是用来解决对象“创建”的问题。以下的例子取自《大话设计模式》中第一章,实现一个可扩展的“计算器”。当增加新的功能时,并不需改动原来已经实现的算法。由于是简易工厂,所以我们还是需要对工厂类进行相应修改。

1.首先,我们定义一个计算的接口

package calc    type CalcSuper interface {      SetData(data ...interface{})      CalcOperate() float64  }

2.接下来,我们实现这个类的两个子类,分别是加法和减法  加法,就是用两个数来相加:)

package calc    import "fmt"    type Add struct {      Num1 float64      Num2 float64  }    func NewAdd() *Add {      instance := new(Add)      return instance  }    func (a *Add) SetData(data ...interface{}) {      if len(data) != 2 {          fmt.Println("error,Need two parameters ")          return      }      if _, ok := data[0].(float64); !ok {          fmt.Println("error,Need float64 parameters ")          return      }      if _, ok := data[1].(float64); !ok {          fmt.Println("error,Need float64 parameters ")          return      }      a.Num1 = data[0].(float64)      a.Num2 = data[1].(float64)  }    func (a Add) CalcOperate() float64 {      return a.Num1 + a.Num2  }

减法,就是把两个数相减:),我感觉我好冷。。。

package calc    import "fmt"    type Subtraction struct {      Num1 float64      Num2 float64  }    func NewSubtraction() *Subtraction {      instance := new(Subtraction)      return instance  }    func (a *Subtraction) SetData(data ...interface{}) {      if len(data) != 2 {          fmt.Println("error,Need two parameters ")          return      }      if _, ok := data[0].(float64); !ok {          fmt.Println("error,Need float64 parameters ")          return      }      if _, ok := data[1].(float64); !ok {          fmt.Println("error,Need float64 parameters ")          return      }      a.Num1 = data[0].(float64)      a.Num2 = data[1].(float64)  }    func (a Subtraction) CalcOperate() float64 {      return a.Num1 - a.Num2  }

3.下面到了大功告成的时候了,定义简易工厂,来实例化这两个类,

在这个简易工厂,我们只传入相应的运算方式,如“+”,“-”,用来创建相关的运算策略。它会返回一个运算接口的实例,当我们得到这个实例,就能调用里面的方法进行运算了。

package calc    type CalcFactory struct {  }    func NewCalcFactory() *CalcFactory {      instance := new(CalcFactory)      return instance  }    func (f CalcFactory) CreateOperate(opType string) CalcSuper {      var op CalcSuper      switch opType {      case "+":          op = NewAdd()      case "-":          op = NewSubtraction()      default:          panic("error ! dont has this operate")      }      return op  }

4.测试

// 简易工厂模式 project main.go  package main    import (      . "calc"      "fmt"  )    func main() {      factory := NewCalcFactory()        op := factory.CreateOperate("+")      op.SetData(1.0, 2.0)      fmt.Println(op.CalcOperate())        op = factory.CreateOperate("-")      op.SetData(1.0, 2.0)      fmt.Println(op.CalcOperate())      /*          输出:3          -1      */  }

现在,我们的简易工厂模式就实现好了,当我们需要添加乘法运算,我们不必再修改或者编译已经完成的加法和减法运算。我们只需要添加乘法相应的结构,并且在factory中加上一个新的switch分支,就可以完成乘法了。

因为go语言中不允许存在抽象类,这使得我实现了一个非常诡异的函数SetData(data …interface{})。它可以传入多个任意对象,用来设置我们结构中需要的数据。这只是一个示例,具体简易工厂有什么其它作用,可以参考《重构与模式》中第6章:创建 的相关知识。讲的非常的全面。