假设我有以下类层次结构:
class abstract Parent{}
class FirstChild extends Parent {}
class SecondChild extends Parent {}
我想从每个 child 创建 DTO 对象:
class abstract ParentDTO {}
class FirstChildDTO extends ParentDTO{}
class SecondChildDTO extends ParentDTO{}
我想我需要一个像这样的工厂方法:
ParentDTO createFrom(Parent source);
有没有什么好方法可以在Java中执行此操作,而无需instanceof
检查和if/else语句?
编辑: 这个工厂方法不起作用:
public ParentDTO create(Parent source)
{
return _create(source);
}
private FirstChildDTO _create(FirstChild source)
{
return new FirstDTO();
}
private SecondChildDTO _create(SecondChild source)
{
return new SecondDTO();
}
private ParentDTO _create(Parent source)
{
return new ParentDTO();
}
它只生成 ParentDTO
,原因如下:
Parent p = new FirstChild();
System.out.println(factory.create(p)); //ParentDTO
FirstChild f = new FirstChild();
System.out.println(factory.create(f)); //FirstChildDTO
最佳答案
如果您坚持使用工厂来创建 DTO,则可以使用简单的方法重载。示例如下:
public class Factory {
public ParentDTO createDTO(Parent parent) {
return new ParentDTO();
}
public FirstChildDTO createDTO(FirstChild firstChild) {
return new FirstChildDTO();
}
public SecondChildDTO createDTO(SecondChild SecondChild) {
return new SecondChildDTO();
}
}
public class Parent {
}
public class FirstChild extends Parent {
}
public class SecondChild extends Parent {
}
public class ParentDTO {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
}
public class FirstChildDTO extends ParentDTO {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
}
public class SecondChildDTO extends ParentDTO {
@Override
public String toString() {
return this.getClass().getSimpleName();
}
}
public class App {
public static void main(String[] args) {
Factory factory = new Factory();
ParentDTO parentDTO = factory.createDTO(new Parent());
System.out.println(parentDTO);
FirstChildDTO firstChildDTO = factory.createDTO(new FirstChild());
System.out.println(firstChildDTO);
SecondChildDTO secondChildDTO = factory.createDTO(new SecondChild());
System.out.println(secondChildDTO);
}
}
在我的 IDE 输出中将应用程序作为 Java 应用程序运行:
父DTO
FirstChildDTO
SecondChildDTO
关于java - 带有继承的工厂方法模式的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30025483/