简单工厂模式违背的开闭原则,拓展新的产品的时候都需要修改旧的代码
逻辑结构

代码实现
代码路径:https://github.com/XBoom/DesignPatterns/tree/main/03_FactoryMethod
-
有一个简单的产品接口(这里指汽车)
1
2
3type Car interface {
Name() string
} -
有两个具体的实现类
1
2
3
4
5
6
7
8type BYD struct {
}
func (B BYD) Name() string {
return "BYD"
}
var _ Car = (*BYD)(nil)另外一个具体类
1
2
3
4
5
6
7
8type Tesla struct {
}
func (t Tesla) Name() string {
return "Tesla"
}
var _ Car = (*Tesla)(nil) -
工厂方法有一个抽象接口,对应具体的产品
1
2
3type Factory interface {
CreateCar() Car
} -
实现具体产品的工厂
1
2
3
4
5
6
7
8type BYDFactory struct {
}
func (B BYDFactory) CreateCar() Car {
return &BYD{}
}
var _ Factory = (*BYDFactory)(nil)另外一个对应具体产品的工厂
1
2
3
4
5
6
7
8type TeslaFactory struct {
}
func (t TeslaFactory) CreateCar() Car {
return &Tesla{}
}
var _ Factory = (*TeslaFactory)(nil)
单元测试
1 | var expectBYD = "BYD" |
跟简单工厂模式相比,当需要增加新的产品的时候,完全不会影响旧的逻辑
总结
- 工厂方法相当于简单工厂模式,实际是通过将对象的创建延迟到具体的工厂类中来解决简单工厂模式的缺点
- 工厂方法模式完全符合开闭原则
- 工厂方法模式适用于类型创建比较复杂不是简单的New,将复杂的创建逻辑拆分到多个工厂类中