我使用需要修补的库。我需要分叉它,因为不使用工厂设计模式。
库具有这样的结构:X 类包含对其他类的引用、对其他类的引用以及更多层。类层次结构是“树状”结构。
我寻找重构的最佳方式——足够灵活以防止人们分叉它。我找不到关于该问题的任何最佳实践。
多年来,我使用“注入工厂”来解决它——工厂模式在工厂方法中注入父对象(DI)。我找不到任何关于这种方法的文档,我需要一些关于它的反馈(例如理论或可能的问题)。
我用 Car 的例子来描述它:
- 汽车有CarInterior
- CarInterior 有里程表
问题 - 无法创建自定义对象,尤其是里程表。
class Car {
CarInterior interior;
public Car() {
interior = new CarInterior();
}
}
class CarInterior {
Odometer odo;
public CasInterior(){
odo = new Odomether();
}
}
class Odometer {
public Odometer(){}
}
仅使用简单工厂方法模式的按书解决方案(可扩展性有限)
class Car {
CarInterior interior;
public Car(CarFactory factory) {
interior = createInterior();
}
CarInterior createInterior() { return new CarInterior(); };
}
class CasInterior {
Odometer odo;
public CarInterior(){
odo = createOdometer();
}
CarInterior createOdometer() {
return new Odomether();
}
}
这种方法的主要问题
- 如果工厂方法需要参数,那么这种更改可能会给 lib 用户带来麻烦。因为扩展类应该改变方法定义。
小问题
- 如果我需要不同的里程表,我应该同时扩展 Car 和 CarInterior
- 我需要 fork 的库只有很少的“级别”,所以这意味着在我设法调用工厂方法之前有很多级别的额外对象。
可能的业务请求
里程表类的可能扩展#1:使用 KM 或 Miles
汽车对象应该有 targetCountry。如果是在法国,则应使用公制单位。如果在美国 - 英里。该业务请求可以通过以下方式实现:
- (重大更改)工厂方法 createOdometer() 获取参数:createOdometer(OdoUnits)
- (重大更改)工厂方法 createInterior() 获取参数:createInterior(OdoUnits) 或 createInterior(Country)
- 如果有更多级别(我的情况),则需要进行更多更改
里程表类的可能扩展#2:里程表值范围
- 0-220公里/小时
- 0-300公里/小时
- ETC
里程表类的可能扩展#3:里程表的颜色应该与汽车的颜色相同
如果我们使用相同的方法,我们应该在方法中引入更多参数。还有更多“代理”功能。
问题
那么解决这个问题的最佳实践是什么?当新需求出现时,我们如何避免/减少方法定义的更改?