我正在读EMF: Eclipse Modeling Framework这本书,上面写着:
EMF编程模型强烈鼓励(但不要求)使用工厂来创建对象。不是简单地使用new运算符来创建[对象]...
为什么鼓励使用工厂而不是new
?
- 您的答案不一定是特定于EMF的,只要它与Java有关。*
我正在读EMF: Eclipse Modeling Framework这本书,上面写着:
EMF编程模型强烈鼓励(但不要求)使用工厂来创建对象。不是简单地使用new运算符来创建[对象]...
为什么鼓励使用工厂而不是new
?
5条答案
按热度按时间a7qyws3x1#
您可以阅读有效的Java第1条:考虑使用静态工厂方法而不是构造函数。它详细描述了使用工厂方法的优势:
fcipmucu2#
我基本上同意这里给出的所有答案,但这些论点一般适用于Java中的每一种情况,但是在EMF的这个特殊情况下还有另一个原因:EMF有它自己的自省机制,例如,用于序列化和反序列化,这不依赖于Java反射。
例如,对于反序列化,它读取XML文件,并使用Ecore模型信息和各自的工厂示例化Java对象。否则,它将需要使用Java反射。
sf6xfgos3#
这个问题的答案在Yegor Bugayenko的《优雅的对象》一书的第一章“1.1永不使用-er名字”一节中得到了解释。
笔者是这样说的:
类是对象的工厂。
类生成对象,尽管我们通常通过说类示例化它们来表达这一点:
这不同于我们所说的工厂模式,但只是因为Java中的这个“新”操作符并不像它所能达到的那样强大。您唯一可以使用它的是创建一个示例--一个对象。如果我们请求类Cash创建一个新对象,我们就会得到一个新对象。没有检查类似的对象是否已经存在并且可以重复使用,也没有修改new的行为的参数。等。
“new”操作符是对象工厂的基本控件。
工厂模式是操作符new的更强大的替代方案,但在概念上它们是相同的。类是对象的工厂。类创建对象、跟踪对象、在必要时销毁对象等。
在Java中,工厂模式的工作方式类似于new操作符的扩展。它通过在前面增加一个额外的逻辑,使它变得更加灵活和强大。
例如:
这是Java中的一个典型工厂,它使用对象类型的文本名称来帮助我们示例化对象。最后,我们仍然使用新的运算符。我的观点是,从概念上讲,Factory模式和new操作符没有太大区别。在完美的OOP语言中,此功能将在新操作符中可用。
cnjp1d6j4#
这里的回答也不是特定于Java的。
1.工厂方法有名字,更容易记住,也不容易出错。
1.它们不需要在每次调用时都创建新的示例,您可以使用预构造类并在此处缓存。
1.它们可以返回任何子类型的对象,而不仅仅是
new
中调用的对象1.可以对调用new对象进行参数化。
abithluo5#
主要是创建对象的简单性。从工厂调用方法要比记住构造函数中每个参数的含义容易得多,这使得代码更改更容易