设计工厂以创建基类的子类

时间:2014-12-18 15:30:29

标签: design-patterns architecture factory-pattern software-design

我正在设计一个显示各种图表的软件,每个图表都使用明确定义的图表相关数据。为数据创建基类并从中扩展每个与图表相关的数据似乎是个好主意,因为它们有很多共同之处。定义图表的抽象基础来处理绘图和其他一些功能似乎也是合理的。为了反映设计中的图表 - 数据关系,我使用模板(Java中的代码):

public abstract class ChartData{
...
}

public abstract class Chart<T extends ChartData>{

  public abstract void onNewData(T data);

  ...

}

public class ConcreteData extends ChartData{
...
}

public class ConcreteChart<ConcreteData>{

  public void onNewData(ConcreteData data){
  ...
  }

...

}

这种设计运作良好,并且足够灵活,可满足我的需求。但是,我从各个地方(如数据库,网络等)接收图表数据,为了测试目的,我愿意创建一个数据工厂。

我想提出一个想法:

  • 单一课程
  • 能够创建扩展ChartData的所有类
  • 这是灵活的,所以它不会破坏我的设计

到目前为止,我最好的方法是为数据类型创建一个枚举,并在工厂方法中添加一个switch-case,然后打开一个参数。我的问题是,有超过10个类扩展ChartData,这个函数的圈复杂度可以接受,并且违反了我的第3条规则。

解决方案不一定是单一方法,但如果它适合单个类,则会很好。

1 个答案:

答案 0 :(得分:0)

如果我理解你的话,我可能会通过使用反射避免切换案例。约束是每个ChartData类必须具有无参数构造函数(或者它们必须都具有兼容的构造函数)。

我的Java有点生疏,但我相信像

public T createObject(Class<T> chartDataClass)
{
    chartDataClass.newInstance()
}
是吗?

http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html