Golang设计模式——01工厂方法模式
工厂方法模式
优点
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
- 工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点
- 一个简单工厂的工厂类,变成一个工厂抽象接口和多个具体生产对象的工厂,于是我们要增加一个新的逻辑运算,就不需要更改原来的工厂类了,只需要增加此功能的运算类和对应的工厂类就可以了。
缺点
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
- 当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的
场景
- 工厂方法模式就是升级版的简单工厂模式
代码
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观察者模式