我正在阅读《EMF:Eclipse建模框架》一书,其中指出:
EMF编程模型强烈鼓励但不要求,使用工厂来创建对象。而不是简单地使用要创建[对象]的新运算符。。。
为什么鼓励使用工厂而不是new
?
您的答案不必是特定于EMF的,只要它与Java有关即可
您可以阅读有效Java项1:考虑静态工厂方法而不是构造函数。它详细描述了使用工厂方法的优点:
-
静态工厂方法的一个优点是,与构造函数不同,它们有名称
-
静态工厂方法的第二个优点是与构造函数不同,不需要每次调用它们时都创建一个新对象。
-
静态工厂方法的第三个优点是与构造函数不同,它们可以返回其返回类型的任何子类型的对象。
-
静态工厂方法的第四个优点是,它们减少了创建参数化类型实例的繁琐(自Java7以来似乎已经过时了)
我基本上同意这里给出的每一个答案,但这些论点通常适用于Java中的每一种情况,然而,在EMF的这种特殊情况下,还有另一个额外的原因:EMF有自己的内省机制,例如,用于序列化和反序列化,而不依赖于Java反射。
例如,对于反序列化,它读取XML文件,并使用Ecore模型信息和相应的工厂实例化Java对象。否则,它将需要使用Java反射。
这里的answer也不是Java特有的。
- 工厂方法有名称,更容易记住,而且不太容易出错
- 它们不需要每次调用都创建一个新实例,您可以在这里使用预构造的类和缓存
- 它们可以返回任何子类型的对象,而不仅仅是
new
中调用的对象 - 您可以参数化调用"new"对象
这个问题的答案在Yegor Bugayenko的Elegant Objects,第1章,Under"1.1切勿使用"er名称";部分
作者说:
类是对象的工厂。
一个类产生对象,尽管我们通常通过说一个类实例化它们来表达这一点:
class Cash {
public Cash(int dollars) {
//...
}
}
Cash five = new Cash(5);
这与我们所说的工厂模式不同,但只是因为;新的";Java中的运算符功能不如预期的强大。你唯一能使用它的就是创建一个实例——一个对象。如果我们要求类Cash制作一个新对象,我们就会得到一个新的对象。没有检查类似的对象是否已经存在并且可以重用,也没有修改新对象行为的参数。等
"新的";操作符是对象工厂的基本控件。
工厂模式是一个更强大的替代运营商新,但概念上他们是一样的。类是对象的工厂。类生成对象,跟踪它们,在必要时销毁它们,等等。
Java中的工厂模式就像是对新操作符的扩展。通过在它前面添加一个额外的逻辑,它使它更加灵活和强大
例如:
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中的一个典型工厂,它帮助我们使用对象类型的文本名称实例化对象。最后,我们仍然使用新的运算符。我的观点是,从概念上讲,工厂模式和新操作员之间没有太大区别在一个完美的OOP语言中,该功能将在新的运算符中提供。
主要是创建对象的简单性。从工厂调用方法比记住构造函数中的每个参数的含义要容易得多+它使代码的更改更容易