Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在下面的代码中使用factory类有什么好处?_Java_Factory - Fatal编程技术网

Java 在下面的代码中使用factory类有什么好处?

Java 在下面的代码中使用factory类有什么好处?,java,factory,Java,Factory,代码如下: SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance(); SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); 如果你可以使用更直观的东西,为什么要使用它呢 SAXParser mySAXParser = new SAXParser(); 因为这允许框架以透明的方式为您提供不同的实现。所使用的实现可能取决于配置参数、框架版本等。使用工厂

代码如下:

SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
如果你可以使用更直观的东西,为什么要使用它呢

SAXParser mySAXParser = new SAXParser();

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


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

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


工厂的目的是使调用者不必专门知道正在使用哪个SAXParser实现。如果需要,它还允许工厂在将解析器交还给调用者之前对其进行配置。

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

您是否需要这种灵活性取决于您的应用程序。许多人建议在每种设计中增加这种灵活性,以防万一。另一些人则认为这种态度过于矫揉造作。你是法官


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

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

“这是单身汉吗?”

不,Javadoc说“这个静态方法创建了一个新的工厂实例。”


“好的,我会问一个更一般的问题。为什么Java中的一些类是通过构造函数实例化的,而其他类是通过静态方法(比如这里提到的.newInstance()方法)实例化的?”

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

“工厂对象”和“工厂方法”模式的目的是避免在对象创建时对特定对象类产生硬依赖。有时这是一件好事,但在其他情况下,工厂只是“负重”。你需要学习。。。根据经验。。。何时使用工厂,何时不使用工厂


如果SAXParser是抽象类 工厂类如何能够 实例化它

嗨,伊曼纽尔。这就是要点:工厂不实例化SAXParser,而是实例化它的某个子类。正如其他人已经提到的,它所实例化的子类是由配置/框架决定的

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

因为SAXParserFactory本身也是(IMHO)抽象的。newInstance()方法从SAXParserFactory的具体子类创建工厂对象。实际上,创建一个具体的工厂是决定选择哪个实现的关键

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


如果SAXParser是一个抽象类,那么工厂类如何实例化它?如果可以的话,还有一个问题。为什么mySAXParserFactory是通过static.newInstance()方法而不是通过其构造函数实例化的?这是单身吗?好的,我会问一个更一般的问题。为什么Java中的一些类是通过构造函数实例化的,而其他类是通过静态方法(比如这里提到的.newInstance()方法)实例化的?太棒了!谢谢你的回答!