以下是代码:
SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
为什么要使用它,如果你可以使用更直观的东西,如:
SAXParser mySAXParser = new SAXParser();
答案 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解析器。
“工厂对象”和“工厂方法”模式的目的是避免在对象创建时对特定对象类具有硬依赖性。有时这是一件好事,但在其他情况下,工厂只是“自重”。你需要通过经验来学习......什么时候使用工厂,什么时候不工作。