2010-02-01 63 views
3

与使用同一对象的实例返回该对象相反,静态工厂类的好处是什么?工厂对象的目的/使用同一实例返回类型的好处

例如,从N2 CMS,看看这个代码:

Newspage新闻= Factory.Persister.Get(ITEMID);

//新闻变量可以设置新闻相关属性。

Factory.Persister.Save(news);

工厂是静态的,我知道工厂对象是做什么的,但我没有看到静态工厂的好处(这可能需要设置不同类型的责任),而不是使用Newspage对象为了这。

由于思想

回答

3

有一个静态的工厂,而不是使用构造的几个优点:

  • 调用new构造函数通常需要创建一个新的对象每次调用时间。但是,静态工厂不是,因此您可以重用不可变对象并缓存经常使用的值,这可以提高性能。

  • 静态工厂有名称;构造函数不。在大多数OOP语言中,它们通常需要与类具有相同的名称,并且可能仅在其类型和参数数量上有所不同。但是静态工厂可以具有不同的名称以及任何类型和数量的参数。

  • 静态工厂可以获取特定的现有对象,如果需要知道只有一个对象,如其标识符。或者如果这个对象不存在,他们可以创建一个全新的对象。再一次,用构造函数做这件事很困难,这取决于你使用的是什么语言。

  • 使用静态工厂,您可以控制和调节在任何给定时间存在的对象 - 与new不同。

  • 静态工厂可以返回任何子类型的对象,但使用构造函数创建对象只会创建特定类型的对象。以这种方式使用静态工厂可以在界面和实现之间创建一个很好的分离。

+0

好点。你能提供你的第一个要点,第二个来自最后一个,最后一个缓存点的例子吗? 谢谢 – dotnetdev 2010-02-01 23:43:48

+0

当然。想象一下,创造一种特定类型的不可变对象,比如说'Car',是非常昂贵的。你可以有一个'Car'构造函数,该构造函数接受一个字符串'VIN'来标记汽车,但是它每次都必须创建一个新的'Car'。如果这个'Car'已经存在?一个静态工厂可以先检查并给你。 – 2010-02-01 23:47:43

0

一派是,如果你创建一个对象,并使用一个对象,那么你紧紧结合到该对象。工厂允许你抽象出对象的实际类型,这样你就不依赖于特定的实现类。例如,如果将来需要从Google缓存而不是从NNTP源创建Newpages,那该怎么办?你是否想为所有创建新闻页面的地方添加新的构造函数和逻辑,或者是否希望在工厂类中抽象出它?

也就是说,我认为静态工厂也不是一个好主意。你如何将它与一个为单元测试目的返回假对象的实现互换?你应该真正考虑一下依赖注入,这样你就不会被绑定到静态对象。由一些工作应用程序定义的唯一静态东西是main()。

+0

Google事物的好例子。 – dotnetdev 2010-02-01 23:44:27

0

我认为静态工厂对非静态工厂的好处与使用静态的好处密切相关。主要是,如果你永远不想实际创建一个对象来调用该方法,则使用静态方法或函数。如果您只想从工厂获得某些东西,则不必首先创建对象。你只是说,嘿,给我你得到的东西,你明白了。

0

据我所知,工厂的优点是你可以要求它创建一个对象,除了识别对象类的幻数之外,不知道其他任何东西。

这是一个插件体系结构中的一个真正的优势,在这个体系结构中,您要编写可以使用长时间开发的对象的代码,或者完全独立于使用它们的代码。

但是,如果所有使用对象的代码都与对象本身在同一个二进制文件中,并且不需要单独编译,那么在工厂中就没有真正的优势,除了作为正式/概念上的分离从使用中执行。

相关问题