工厂方法模式
优点
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
- 工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点
- 一个简单工厂的工厂类,变成一个工厂抽象接口和多个具体生产对象的工厂,于是我们要增加一个新的逻辑运算,就不需要更改原来的工厂类了,只需要增加此功能的运算类和对应的工厂类就可以了。
缺点
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
- 当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的
场景
- 工厂方法模式就是升级版的简单工厂模式
代码
package Factory_Method type number struct { a float64 b float64 } type Operation interface { SetA(float64) SetB(float64) GetResult() float64 } func (num *number) SetA(n float64) { num.a = n } func (num *number) SetB(n float64) { num.b = n } type addOperation struct { number } func (num *addOperation) GetResult() float64 { return num.a + num.b } type subOperation struct { number } func (num *subOperation) GetResult() float64 { return num.a - num.b } type mulOperation struct { number } func (num *mulOperation) GetResult() float64 { return num.a * num.b } type Factory interface { CreateOperation() Operation } type AddFactory struct { } func (a *AddFactory) CreateOperation() Operation { return &addOperation{} } type SubFactory struct { } func (s *SubFactory) CreateOperation() Operation { return &subOperation{} } type MulFactory struct { } func (m *MulFactory) CreateOperation() Operation { return &mulOperation{} }
package Factory_Method import ( "fmt" "testing" ) func TestCreateOperation(t *testing.T) { fac := &AddFactory{} opAdd := fac.CreateOperation() opAdd.SetA(1) opAdd.SetB(2) fmt.Println(opAdd.GetResult()) }
其他设计模式
设计模式Git源代码
00简单工厂模式
01工厂方法模式
02抽象工厂模式
03外观模式
04建造者模式
05桥接模式
06命令模式
07迭代器模式
08模板模式
09访问者模式
10备忘录模式
11责任链模式
12中介模式
13原型模式
14状态模式
15策略模式
16享元模式
17组合模式
18解释器模式
19单例模式
20适配器模式
21代理模式
22装饰器模式
23观察者模式