为什么要用工厂而不是“新的”呢?

iaqfqrcu  于 2022-09-21  发布在  Eclipse
关注(0)|答案(5)|浏览(181)

我正在读EMF: Eclipse Modeling Framework这本书,上面写着:
EMF编程模型强烈鼓励(但不要求)使用工厂来创建对象。不是简单地使用new运算符来创建[对象]...

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

  • 您的答案不一定是特定于EMF的,只要它与Java有关。*
a7qyws3x

a7qyws3x1#

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

  • 静态工厂方法的一个优点是,与构造函数不同,它们有名称
  • 静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象。
  • 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。
  • 静态工厂方法的第四个优点是它们减少了创建参数化类型示例的繁琐(似乎从Java 7开始就过时了)
fcipmucu

fcipmucu2#

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

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

sf6xfgos

sf6xfgos3#

这个问题的答案在Yegor Bugayenko的《优雅的对象》一书的第一章“1.1永不使用-er名字”一节中得到了解释。

笔者是这样说的:

类是对象的工厂。

类生成对象,尽管我们通常通过说类示例化它们来表达这一点:

class Cash {
    public Cash(int dollars) {
    //...
    }
}
Cash five = new Cash(5);

这不同于我们所说的工厂模式,但只是因为Java中的这个“新”操作符并不像它所能达到的那样强大。您唯一可以使用它的是创建一个示例--一个对象。如果我们请求类Cash创建一个新对象,我们就会得到一个新对象。没有检查类似的对象是否已经存在并且可以重复使用,也没有修改new的行为的参数。等。

“new”操作符是对象工厂的基本控件。

工厂模式是操作符new的更强大的替代方案,但在概念上它们是相同的。类是对象的工厂。类创建对象、跟踪对象、在必要时销毁对象等。

在Java中,工厂模式的工作方式类似于new操作符的扩展。它通过在前面增加一个额外的逻辑,使它变得更加灵活和强大。

例如:

class Shapes {
    public Shape make(String name) {
        if (name.equals("circle")) {
            return new Circle();
        }
        if (name.equals("rectangle")) {
            return new Rectangle() ;
        }
        throw new IllegalArgumentException("not found");
    }
}

这是Java中的一个典型工厂,它使用对象类型的文本名称来帮助我们示例化对象。最后,我们仍然使用新的运算符。我的观点是,从概念上讲,Factory模式和new操作符没有太大区别。在完美的OOP语言中,此功能将在新操作符中可用

cnjp1d6j

cnjp1d6j4#

这里的回答也不是特定于Java的。

1.工厂方法有名字,更容易记住,也不容易出错。
1.它们不需要在每次调用时都创建新的示例,您可以使用预构造类并在此处缓存。
1.它们可以返回任何子类型的对象,而不仅仅是new中调用的对象
1.可以对调用new对象进行参数化。

abithluo

abithluo5#

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

相关问题