【发布时间】:2009-09-21 20:21:55
【问题描述】:
我正在寻找重构此场景的最佳方法(更好的设计,最少的工作)的想法。 从以下示例抽象类开始(实际上还有更多的字段、方法和抽象方法):
abstract class Car
{
private int manufactureYear;
// ... many more fields that are hard to clone
public Car(int manYear)
{
this.manufactureYear = manYear;
}
abstract public Color getColor();
abstract public int getNumCylinders();
}
有很多子类(比如 100 个)扩展了这个类。这些子类被视为汽车的“规格”。这里有两个例子:
class CarOne extends Car
{
private static Color COLOR = Color.Red;
private static int CYLINDERS = 4;
public CarOne(int manYear)
{
super(manYear);
}
public final Color getColor();
{
return COLOR;
}
public final int getNumCylinders()
{
return CYLINDERS;
}
}
class CarOneThousand extends Car
{
private static Color COLOR = Color.Black;
private static int CYLINDERS = 6;
public CarOneThousand(int manYear)
{
super(manYear);
}
public final Color getColor();
{
return COLOR;
}
public final int getNumCylinders()
{
return CYLINDERS;
}
}
在运行时汽车对象被实例化和使用:
CarOne carObject = new CarOne(2009);
carObject.getColor();
carObject.getNumCylinders();
然而,在得到一些外部数据后,我发现这辆车被重新粉刷过,引擎也被改变了。汽车的新规格变为:
class ModCar extends Car
{
private static Color COLOR = Color.Blue;
private static int numCylinders = 8;
public ModCar (int manYear)
{
super(manYear);
}
public final Color getColor();
{
return COLOR;
}
public final int getNumCylinders()
{
return numCylinders;
}
}
因此确实需要将这些规范“应用”到新的carObject,而无需修改现有字段,例如manufactureDate。问题是如何在运行时更新carObject 的同时,最大限度地减少对这 100 多个子类的更改代码(最好保持不变)。
注意我被要求处理这段代码,所以我一开始就没有在这种情况下编写它。
【问题讨论】:
标签: java design-patterns refactoring abstract-class