工厂对象的目的/使用相同实例返回类型的好处

时间:2010-02-01 23:25:14

标签: design-patterns oop

与使用同一对象的实例返回该对象相比,静态工厂类有什么好处?

例如,从N2 CMS,请看一下这段代码:

Newspage news = Factory.Persister.Get(itemID);

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

Factory.Persister.Save(新闻);

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

由于

4 个答案:

答案 0 :(得分:3)

静态工厂有一些优点,而不是使用构造函数:

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

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

  • 静态工厂可以抓取特定的现有对象,如果需要,只知道该对象的一部分,例如其标识符。或者如果那个对象不存在,他们可以创建一个全新的对象。同样,使用构造函数来执行此操作会更难,具体取决于您使用的语言。

  • 使用静态工厂,您可以控制和管理在任何给定时间存在的对象 - 而不是new

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

答案 1 :(得分:0)

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

那就是说,我认为静态工厂也不是一个好主意。你会如何将它与一个返回虚假对象的实现交换出来进行单元测试?你应该真正研究依赖注入,这样你就不会依赖于静态对象。一些工作应用程序定义的唯一静态事物是main()。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

这在插件体系结构中是一个真正的优势,在这种体系结构中,您希望编写的代码可以使用在使用它们的代码之后很久或完全独立开发的对象。

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