首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计工厂以创建基类的子类

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

Stack Overflow用户
提问于 2014-12-18 15:30:29
回答 1查看 76关注 0票数 0

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

代码语言:javascript
复制
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的所有类。
  • 那是灵活的,所以它不会破坏我的设计

到目前为止,我最好的方法是为数据类型创建一个枚举,并在工厂方法中添加一个开关大小写,打开一个参数。我的问题是,有超过10个类扩展了ChartData,这个函数的圈复杂度超出了可接受的范围,违反了我的第三条规则。

这个解决方案不必是一个单一的方法,但是如果它适合于一个类的话,那就更好了。

EN

回答 1

Stack Overflow用户

发布于 2014-12-21 00:21:26

如果我对你的理解是正确的,我可能会避免使用反射的开关情况。约束条件是每个ChartData类必须有一个无参数的构造函数(或者它们都必须有兼容的构造函数)。

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

代码语言:javascript
复制
public T createObject(Class<T> chartDataClass)
{
    chartDataClass.newInstance()
}

是吗?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27550112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档