JDK DOM Parser:为什么选择工厂?

时间:2016-08-29 16:45:13

标签: java xml dom factory

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

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

“如果用户输入'Dog'作为String,我们可以使用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更好,它有自己的显式构造函数并以相同的方式传递文件?

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

DocumentBuilderFactory.newInstance()将返回以下两种实现之一:

  1. a" javax.xml.parsers.DocumentBuilderFactory"
  2. 或者如果不存在

    1. a" com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"。
    2. 我不是100%肯定 - 但在这个特定情况下 - 看起来它想要给你一个较新的DocumentBuilderFactory实现(随JRE一起提供)。如果它不在那里你得到旧的。

      工厂模式的强大之处在于它会返回一些可以在编码器(你)担心实现的情况下使用的东西。如果它来自java.xml.parsers包或旧的com.sun.org.apache.xerces.internal.jaxp包,我们知道我们得到的内容可以以相同的方式使用。将来,如果创建了一个新的XML解析器(可能更快)并且他们决定替换javax.xml中的那个,那么对于使用API​​的编码器来说它并不重要 - 它只会工作" #34 ;.他们将受益于新代码(如果在那里),或者他们将使用之前的实现之一。

      工厂是一种创造性的模式"。您可以以相同的方式返回几种类型的对象(由程序员执行)。

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

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

      您可以通过让工厂创建适当的对象来节省时间。如果你引入了Snake(),那么你只需要在一个地方更新创建代码。

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

      如果有什么不明确的地方让我知道,我会更新我的答案。

      以下是我最喜欢的设计模式书中的一章:Head First Design Patterns

答案 1 :(得分:0)

对于JAXP接口,工厂模式的使用是尝试在不“锁定”到JAXP接口的特定实现的情况下编写应用程序;相反,它允许在运行时根据外部配置选择实现库(例如,类路径上的内容和系统属性的值)。

这种方法取得了成功。虽然它确实可以很容易地从一个实现切换到另一个实现(例如Xalan到Saxon),但它也使得应用程序可以使用XML解析器或XSLT引擎执行,而它从未经过测试,并且如果应用程序结果是依赖于特定应用程序的特性,如果运行时配置不正确,它将以不可预测的方式失败。例如,看到用Xalan编写和测试的应用程序只是因为Saxon在类路径上而失败,这并不罕见。