定义
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
结构图
- Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。(条件分支判断创建哪个产品类)
- IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- Product:具体产品类,是简单工厂模式的创建目标。
代码
package main
import "fmt"
type Operator interface {
GetResult()float64
}
type BaseOperation struct {
NumA float64
NumB float64
}
type OperationAdd struct {
B BaseOperation
}
func (o *OperationAdd)GetResult()float64{
return o.B.NumA + o.B.NumB
}
type OperationSub struct {
B BaseOperation
}
func (o *OperationSub)GetResult()float64{
return o.B.NumA - o.B.NumB
}
type OperationFactroy struct {
}
func (o *OperationFactroy) CreateOperate(operate string,numA,numB float64)Operator{
var ret Operator
switch operate {
case "+":
ret = &OperationAdd{
B:BaseOperation{
numA,numB,
},
}
break
case "-":
ret = &OperationSub{
B:BaseOperation{
numA,numB,
},
}
break
}
return ret
}
func main() {
f := OperationFactroy{}
oper := f.CreateOperate("+",1,2)
ret := oper.GetResult()
fmt.Println(ret)
}
优点:
工厂类是整个工厂模式的核心,我们只需要传入给定的信息,就可以创建所需实例,在多人协作的时候,无需知道对象之间的内部依赖,可以直接创建,有利于整个软件体系结构的优化
缺点:
- 工厂类中包含了所有实例的创建逻辑,一旦这个工厂类出现问题,所有实例都会受到影响并且
- 工厂类中生产的产品都基于一个共同的接口,一旦要添加不同种类的产品,这就会增加工厂类的复杂度,将不同种类的产品混合在一起,违背了单一职责,系统的灵活性和可维护性都会降低
- 并且当新增产品的时候,必须要修改工厂类,违背了『系统对扩展开放,对修改关闭』的原则