java - JDK DOM 解析器 : Why Factories?

标签 java xml dom factory

我目前正在使用 JDK 的标准 DOM 解析器进行 XML 解析。

但是,我认为现在是了解工厂模式的重点的好时机。我之前尝试寻找 Factory 实用程序的示例,并且许多解释尝试使用如下示例:

“如果用户输入“Dog”作为字符串,我们可以使用 AnimalFactory 来识别“Dog”并实例化相应的对象,如果我们不知道运行时需要什么,这非常有用。”

这些例子并没有真正让我明白这一点(也许是因为我忽略了一些东西),我觉得理解为什么 Factory 是在 JDK 的标准 DOM 解析器中实现的会对我(希望其他人)有帮助。出去。所以这里是:

我读到,读取 XML 文档需要实例化 DocumentBuilder 对象,该对象只能通过从 DocumentBuilderFactory 对象中检索,如下所示:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

现在我们可以像这样将 File 对象传递给它:

File myFile = Paths.get(fooPath).toFile();
builder.parse(myFile);

但是,为什么流程值得使用工厂模式呢?为什么上述方法比具有自己的显式构造函数并以相同方式传递文件的 DocumentBuilder 更好?

在这种情况下,是否只是为具有类似目的的对象组织构造函数的问题?

提前致谢。

最佳答案

DocumentBuilderFactory.newInstance() 将返回两个实现之一:

  1. “javax.xml.parsers.DocumentBuilderFactory”

或者如果不存在

  • “com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl”。
  • 我不是 100% 确定 - 但在这种特定情况下 - 看起来它想为您提供 DocumentBuilderFactory 的更新实现(随 JRE 一起提供)。如果它不在那里,你就得到旧的。

    工厂模式的强大之处在于它会返回一些可以使用的东西,而无需编码器(您)担心实现。如果它来自 java.xml.parsers 包或旧的 com.sun.org.apache.xerces.internal.jaxp 包,我们知道我们返回的内容可以以相同的方式使用。将来,如果创建了一个新的 XML 解析器(也许更快)并且他们决定替换 javax.xml 中的解析器,那么对于使用 API 的编码人员来说并不重要 - 它会“正常工作”。他们将从新代码(如果有)中受益,或者他们将使用以前的实现之一。

    工厂是一种“创造模式”。您可以返回多种类型的对象,这些对象都可以(由程序员)以相同的方式进行操作。

    当您编码时,您发现自己做了很多事情:

    MyObject genericObject = null;
    
    if mySetting.equals("dog") {
        genericObject  = new Dog();
    } else if { mySetting.equals("cat") {
        genericObject  = new Cat();
    } 
    genericObject.speak();
    

    让工厂创建正确的对象可以节省时间。如果您引入 Snake(),那么您只需在一处更新创建代码。

    该模式通常用于创建具有相同契约(接口(interface))的对象,因此它通常有助于多态性

    如果有不清楚的地方,请告诉我,我会更新我的答案。

    这是我最喜欢的《设计模式》书中的一章:Head First Design Patterns

    关于java - JDK DOM 解析器 : Why Factories?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39211196/

    相关文章:

    java - 如何使用XStream将对象的数据部分转换为XML?

    javascript - 在没有 AJAX 的情况下获取文件上传状态

    javascript - 如何从 Controller 获取表示 ngRepeat 中元素的 HTML 节点的参数?

    javascript - 如何在自动删除特定 HTML 元素时触发事件?

    java - HTTP 错误 : 404 in accessing to kura web ui

    java - 将多个actionListener添加到多个JButton

    java - Android - 将 XML 架构发布到 PHP 服务器 API

    java - mongo-operations spring mongo批量操作执行异常(CodecConfigurationException : Can't find a codec for class)

    c# - 如何在 c# 中制作一个 xml 文件以与作为数据表导入的 .iqy 一起使用

    java - 在 Servlet 中以字符串形式获取文件内容