在以下代码中使用工厂类有什么好处?

时间:2010-06-11 09:17:18

标签: java factory

以下是代码:

SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();

为什么要使用它,如果你可以使用更直观的东西,如:

SAXParser mySAXParser = new SAXParser();

5 个答案:

答案 0 :(得分:7)

因为这允许框架以透明的方式为您提供SAXParser的不同实现。使用的实现可能取决于配置参数,框架版本等。使用工厂允许框架开发人员例如用不同的,更好的解析器替换旧的,低效的解析器实现,而不破坏任何客户端代码。

请注意SAXParser是一个抽象类,因此您甚至无法直接实例化它。

答案 1 :(得分:4)

SAXParser是一个抽象类,您不能直接实例化该类。

工厂的目的是将调用者与必须具体知道SAXParser的哪个实现正在使用中解耦。它还允许Factory在需要之前配置解析器,然后再将其交还给调用者。

答案 2 :(得分:3)

  

如果SAXParser是抽象类   Factory类是如何实现的   实例化它?

嗨Emanuil。这就是要点:工厂不会实现SAXParser,而是它的某个子类。正如其他人已经提到的那样,它确切地实现了哪个子类,由配置/框架决定。

  

为什么mySAXParserFactory通过静态.newInstance()方法而不是通过其构造函数实例化?

因为SAXParserFactory本身又是(恕我直言)摘要。 newInstance()方法从SAXParserFactory的具体子类创建工厂对象。实际上,创建一个具体的工厂是决定选择哪种实现的点。

这称为“抽象工厂模式”,另见:

答案 3 :(得分:2)

它允许您确定将在与特定代码行不同的位置使用的Parser对象的实际类。构造函数必须明确说明它们构造的类型;工厂方法可以隐藏界面背后的决定。

您是否需要这种灵活性取决于您的申请。许多人建议在每种设计中增加灵活性以防万一。其他人发现这种态度怪诞过度。你是法官......

答案 4 :(得分:1)

  

“如果可以,还有一个问题。为什么mySAXParserFactory通过静态newInstance()方法而不是通过其构造函数实例化?”

避免代码对特定SAXParserFactory类具有编译时依赖性。如果查看newInstance()方法的javadoc,您将看到它允许您通过系统属性,属性文件或Services API配置不同的解析器工厂类。

  

“这是一个单身人士吗?”

没有。 Javadoc说:“这种静态方法创建了一个新的工厂实例。” (我的重点)

  

“好的,我会问一个更普遍的问题。为什么Java中的某些类通过构造函数和其他类实例化 - 通过静态方法(如此处提到的.newInstance()方法)?”

不同的类具有不同的用例。例如,您不希望或不需要实现您的应用程序,以便有人可以选择使用哈希映射或树映射来表示某些数据结构。但是,您可能希望某人能够选择不同的XML解析器。

“工厂对象”和“工厂方法”模式的目的是避免在对象创建时对特定对象类具有硬依赖性。有时这是一件好事,但在其他情况下,工厂只是“自重”。你需要通过经验来学习......什么时候使用工厂,什么时候不工作。