【问题标题】:What is the benefit of using a factory class in the following code?在以下代码中使用工厂类有什么好处?
【发布时间】:2010-06-11 09:17:18
【问题描述】:

代码如下:

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

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

SAXParser mySAXParser = new SAXParser();

【问题讨论】:

    标签: java factory


    【解决方案1】:

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

    注意SAXParser是一个抽象类,所以你甚至不能直接实例化它。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果 SAXParser 是一个抽象类,Factory 类如何实例化它?
      • 我可以再问一个问题。为什么 mySAXParserFactory 是通过静态 .newInstance() 方法而不是通过其构造函数实例化的?这是单身人士吗?
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 太棒了!感谢您的精彩回答!
      【解决方案4】:

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

      您是否需要这种灵活性取决于您的应用程序。许多人建议在每个设计中增加这种灵活性,以防万一。其他人则认为这种态度被过度设计了。你来评判……

      【讨论】:

        【解决方案5】:

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

        为了避免您的代码在编译时依赖于特定的SAXParserFactory 类。如果您查看 newInstance() 方法的 javadoc,您会发现它允许您通过系统属性、属性文件或服务 API 配置不同的解析器工厂类。

        “这是单例吗?”

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

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

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

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

        【讨论】:

        • 好的,我会问一个更一般的问题。为什么 Java 中的某些类通过构造函数实例化,而另一些类通过静态方法(如此处提到的 .newInstance() 方法)?
        猜你喜欢
        • 2018-03-05
        • 2020-03-21
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多