1

我使用需要修补的库。我需要分叉它,因为不使用工厂设计模式。

库具有这样的结构: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:里程表的颜色应该与汽车的颜色相同

如果我们使用相同的方法,我们应该在方法中引入更多参数。还有更多“代理”功能。

问题

那么解决这个问题的最佳实践是什么?当新需求出现时,我们如何避免/减少方法定义的更改?

4

1 回答 1

0

《注塑厂》

  • 工厂方法需要一个额外的参数——父对象。
  • 里程表获取其工厂,获取汽车对象并请求所有需要的数据以适应“汽车规格”

代码:

class CarFactory {
  CarInterior createInterior(Car car) { return new CarInterior(car); }
  Odometer createOdometer(CarInterior interior){ return new Odometer(interior); };
}
class Car {
  CarFactory factory;
  CarInterior interior;
  public Car(CarFactory factory) {
    this.factory = factory;
    interior = factory.createInterior(this);
  }
  CarFactory getFactory(){ return factory; };
}
class CarInterior {
  Car car;
  Odometer odo;
  public CarInterior(Car car){
    this.car = car;
    CarFactory factory = car.getFactory();
    odo = factory.createOdometer( this );
  }
}
class Odometer {
  public Odometer(CarInterior interior) {
    Car car = interior.getCar();
    OdoUnits odoUnits = car.getTargetCountry().getUnits();
    int maxEngineSpeed = car.getEngine().getTopSpeed;
    Color color = car.getColor();
    if (!car.isOptionColorOdometer())
      color = DEFAULT_COLOR; 
    // etc
  }
}
于 2021-07-02T14:30:49.127 回答