Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例的创建模式取决于多个子类实例_Java_Design Patterns - Fatal编程技术网

Java 实例的创建模式取决于多个子类实例

Java 实例的创建模式取决于多个子类实例,java,design-patterns,Java,Design Patterns,我有一个问题,因为我无法确定一个合适的设计模式 我想根据已传递给工厂方法的给定类型创建实例。到目前为止,我所做的工作如下: T create(SuperType x) { if (x instanceof SubType1) { // do some stuff and return a new SubType extends T } else if (x instanceof SubType2) { // do some stuff and return a new S

我有一个问题,因为我无法确定一个合适的设计模式

我想根据已传递给工厂方法的给定类型创建实例。到目前为止,我所做的工作如下:

T create(SuperType x) {
  if (x instanceof SubType1) {
    // do some stuff and return a new SubType extends T
  } else if (x instanceof SubType2) {
    // do some stuff and return a new SubType extends T
  } else if ...

  } else {
    throw new UnSupportedOperationException("nothing defined for " + x);
  }
}
对我来说,这似乎不是最好的做法

有人知道如何更好地解决这个问题吗


编辑:我收到的类不是我自己创建的,它是一个实例,它有几个子类,我根据传递的类型为这些子类创建新实例。

在面向对象编程中,打开类型通常是通过多态性实现的,通过将create方法移动到
超类型
(可以为每个
子类型
)或通过


编辑:如果不能更改类,则多态性将被删除。但幸运的是,该类似乎支持访问者模式(请参见它的
visit()
method),因此您仍然可以使用它。

但是要使用多态性,我必须将我不希望的转换为实际的子类型。不,多态性不需要转换。抱歉,但是当我有一个方法
create(SuperType)
create(subtype)
子类型扩展子类型
),您可以使用
超类型x=。。。;对象。创建(x)第一个方法将始终被调用…好吧,我会看看我能对访问者模式做些什么,尽管我从来没有真正理解过它…好吧,它有点工作,但我不喜欢我生成的代码。但我认为没有办法做得更好…传递的每个子类型是否恰好匹配一个返回类型?不,它取决于对象本身或某个程序状态中的多个参数。。。