【问题标题】:Why use a factory instead of 'new'?为什么使用工厂而不是“新”?
【发布时间】:2015-05-30 06:42:53
【问题描述】:

我正在阅读这本书 EMF: Eclipse Modeling Framework,其中写着:

EMF 编程模型强烈鼓励但不要求, 使用工厂来创建对象。而不是简单地使用 new 运算符来创建[一个对象]...

为什么鼓励使用工厂而不是new

您的答案不必是特定于 EMF 的,只要它与 Java 有关即可。

【问题讨论】:

    标签: java eclipse eclipse-emf emf eclipse-emf-ecore


    【解决方案1】:

    这里的答案也不特定于 Java。

    1. 工厂方法有名称,更容易记住,而且不易出错。
    2. 它们不需要在每次调用时都创建新实例,您可以在此处使用预构建的类和缓存。
    3. 它们可以返回任何子类型的对象,不仅是在new 中调用的对象
    4. 您可以参数化调用“新”对象。

    【讨论】:

      【解决方案2】:

      您可以阅读有效的 Java 第 1 条:考虑静态工厂方法而不是构造函数。它详细描述了使用工厂方法的优点:

      • 静态工厂方法的一个优点是,与构造函数不同,它们 有名字

      • 静态工厂方法的第二个优点是,与构造函数不同, 它们不需要在每次调用时都创建一个新对象。

      • 静态工厂方法的第三个优点是,与构造函数不同, 它们可以返回其返回类型的任何子类型的对象。

      • 静态工厂方法的第四个优点是它们减少了创建参数化类型实例的冗长性(自 Java 7 以来似乎已经过时)

      【讨论】:

      • 一个更好的答案是总结这里的东西,而不是参考一本(非常好的)书
      • 我同意这一切。提问者询问了“工厂”,我将其解读为静态工厂方法和工厂对象。工厂对象是用于提供实例的对象。在向其他对象“注入”设置和多态性方面,它们具有许多额外的功能。
      • 第二个优势:“构造函数中抛出的异常”潜伏在后台。
      • (Offtopic?)有趣的书。现在读它。过去已阅读干净的代码和完整的代码。你能推荐其他类似的书吗?
      【解决方案3】:

      我同意这里给出的所有答案,但这些论点通常适用于 Java 中的每种情况,但是在 EMF 的这种特殊情况下还有另一个额外的原因:EMF 有自己的自省机制,例如,用于序列化和反序列化,不依赖于Java反射。

      例如,对于反序列化,它读取 XML 文件,并使用 Ecore 模型信息和相应的工厂实例化 Java 对象。否则需要使用 Java 反射。

      【讨论】:

        【解决方案4】:

        主要是创建对象的简单性。从工厂调用方法比记住构造函数中每个参数的含义要容易得多+它使代码的更改更容易

        【讨论】:

        • 好吧,如果需要,工厂方法也会有参数。如果您有疑问,请不要在不参考 javadoc 的情况下编写任何一种调用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        • 2010-10-25
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多