我正在设计一个显示各种图表的软件,每个图表都使用定义良好的、依赖于图表的数据。为数据创建一个基类并从它扩展与图表相关的数据似乎是个好主意,因为它们有很多共同点。为图表定义一个抽象的基础来处理绘图和其他一些功能似乎也是合理的。为了在设计中反映图表-数据关系,我使用了模板(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){
...
}
...
}这个设计工作得很好,而且足够灵活,可以满足我的需要。然而,我从不同的地方(如数据库、网络等)接收图表数据,为了测试目的,我愿意创建一个数据工厂。
我试着想出一个主意来做:
到目前为止,我最好的方法是为数据类型创建一个枚举,并在工厂方法中添加一个开关大小写,打开一个参数。我的问题是,有超过10个类扩展了ChartData,这个函数的圈复杂度超出了可接受的范围,违反了我的第三条规则。
这个解决方案不必是一个单一的方法,但是如果它适合于一个类的话,那就更好了。
发布于 2014-12-21 00:21:26
如果我对你的理解是正确的,我可能会避免使用反射的开关情况。约束条件是每个ChartData类必须有一个无参数的构造函数(或者它们都必须有兼容的构造函数)。
我的Java有点生疏,但我相信
public T createObject(Class<T> chartDataClass)
{
chartDataClass.newInstance()
}是吗?
http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
https://stackoverflow.com/questions/27550112
复制相似问题