为什么使用工厂而不是"新"?



我正在阅读《EMF:Eclipse建模框架》一书,其中指出:

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

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

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

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

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

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

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

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

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

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

这里的answer也不是Java特有的。

  1. 工厂方法有名称,更容易记住,而且不太容易出错
  2. 它们不需要每次调用都创建一个新实例,您可以在这里使用预构造的类和缓存
  3. 它们可以返回任何子类型的对象,而不仅仅是new中调用的对象
  4. 您可以参数化调用"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语言中,该功能将在新的运算符中提供

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

相关内容

  • 没有找到相关文章

最新更新