java - 带有继承的工厂方法模式的好方法

标签 java oop design-patterns factory factory-pattern

假设我有以下类层次结构:

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/

相关文章:

java - 在循环中使用 XPath 表达式

java - 为什么我在 Java 中收到 NoClassDefFoundError 错误?

php - 类似于 PHP 中的重载?

java - 通过Void方法设置实例变量而不是获取返回值

c# - 如何在没有 yield 语句的情况下实现迭代器模式 (IEnumerator<T>)

java - Jackson 映射对象是 DAO 吗?

javascript - 如何继承静态方法?

java - 正则表达式匹配变量声明

c# - 帮助我了解如何在 OOP C# 中使用类

java - 数据传输对象 DTO 在哪里构建