简单工厂模式的特点是工厂可以根据条件产生不同功能的类,从而达到提高程序代码的可复用性。
package main import ( "fmt" ) type Operater interface { //运算接口 Operate(int, int) int } type AddOperate struct { //加法运算类,实现了运算接口 } func (this *AddOperate)Operate(rhs int, lhs int) int { return rhs + lhs } type SubOperate struct { //减法运算类,实现了运算接口 } func (this *SubOperate)Operate(rhs int, lhs int) int { return rhs - lhs } type OperateFactory struct { } func NewOperateFactory() *OperateFactory { return &OperateFactory{} } func (this *OperateFactory)CreateOperate(operatename string) Operater { switch operatename { case "+": return &AddOperate{} case "-": return &SubOperate{} default: panic("无效运算符号") return nil } } int main() { defer func() { if err := recover(); err != nil { fmt.Println(err) } }{} Operator := NewOperateFactory().CreateOperate("+") //这时候Operator 不可能为nil fmt.Printf("add result is %d\n", Operator.Operate(1,2)) //add result is 3 return }
在这个例子中,各种运算方法类实现了运算接口,在业务上如果想添加一种运算方法,只需要增加一个实现运算接口的类,并且在工厂类中添加一个类型判断。这种设计适合于业务类型并不是很多的情况,如果业务类型非常多,那么在工作类中就会有一个很长的switch...case结构,这时候使用方法工厂模式会比较合适。在正常情况下,工厂类可以用一个函数代替。但是为了其类图逻辑的美观会将它定义为一个工厂类。简单工厂方法将业务类型判断的逻辑放在工厂类中,使得调用工厂类过程比较简单和统一。假如将简单工厂模式中的工厂类的逻辑判断转移到工厂类调用者上,就会变成工厂方法模式,这样的话一个具体的工厂类会与一个具体的产品类一一对应。如果再进一步,一个具体工厂类中组合多个具体产品类,那么方法工厂模式就会变成抽象工厂模式了。在应用过程中可以说各有各的好处,必须看具体的应用场景,比如如果将工厂类产生具体的产品的逻辑放在调用工厂类过程后面的业务逻辑基本一致,那么采用简单工厂方法会比其他两中工厂方法好。而如果调用工厂类产生具体产品类后的业务逻辑都不大相同,那么简单工厂模式就不是一个很好的选择。
面向对象程序设计与语言无关,而是一种程序设计的思想,只是不同语言实现起来的难度或者所直观程度不相同。go语言相对于c/c++来说对各种设计模式的实现上的支持还是比较好的。