【问题标题】:Designing a factory to create subclasses of a base class设计工厂以创建基类的子类
【发布时间】:2014-12-18 15:30:29
【问题描述】:

我正在设计一个显示各种图表的软件,每个图表都使用定义明确的图表相关数据。为数据创建一个基类并从中扩展每个与图表相关的数据似乎是个好主意,因为它们有很多共同点。为图表定义一个抽象基础来处理绘图和其他一些功能似乎也是合理的。为了反映设计中的图表数据关系,我使用了模板(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 的类,这个函数的圈复杂度超出了可接受的范围,违反了我的第三条规则。

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

【问题讨论】:

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


    【解决方案1】:

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

    我的 Java 有点生疏了,但我相信类似

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

    有吗?

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

    【讨论】:

    • 使用反射并不是我想要的,因为我想要一个独立于语言的架构解决方案来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多