首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >构造函数与工厂方法

构造函数与工厂方法
EN

Stack Overflow用户
提问于 2009-03-10 04:38:29
回答 10查看 86.1K关注 0票数 201

在对类建模时,首选的初始化方式是什么:

工厂构造函数,或

  1. Methods

使用这两种方法的考虑因素是什么?

在某些情况下,我更喜欢有一个工厂方法,如果对象不能构造,它会返回null。这使得代码很整洁。在采取替代操作之前,我可以简单地检查返回值是否不为null,而不是从构造函数抛出异常。(我个人不喜欢例外)

比方说,我在一个类上有一个构造函数,它需要一个id值。构造函数使用此值填充数据库中的类。如果不存在具有指定id的记录,则构造函数将抛出RecordNotFoundException。在这种情况下,我必须将所有此类类的构造封装在一个try..catch块中。

相反,我可以在那些类上有一个静态工厂方法,如果没有找到记录,它将返回null。

在这种情况下,构造函数和工厂方法哪种更好?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-03-10 04:43:27

来自Design Patterns: Elements of Reusable Object-Oriented Software by Gamma, Helm, Johnson, and Vlissides.的第108页

在以下情况下使用Factory Method模式

  • a class不能预期它必须创建的对象类
  • 一个类希望它的子类指定它将责任委派给几个帮助器子类之一的对象,并且您希望本地化哪个帮助器子类是
票数 63
EN

Stack Overflow用户

发布于 2009-03-10 05:18:29

问问你自己,它们是什么,为什么我们要有它们。它们都是用来创建对象实例的。

代码语言:javascript
复制
ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside

到目前为止没有什么不同。现在假设我们有不同的学校类型,并且我们想要从使用ElementarySchool切换到HighSchool (它派生自ElementarySchool或实现与ElementarySchool相同的接口ISchool )。代码更改将为:

代码语言:javascript
复制
HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside

在接口的情况下,我们将具有:

代码语言:javascript
复制
ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside

现在,如果你在多个地方都有这段代码,你会发现使用工厂方法可能非常便宜,因为一旦你改变了工厂方法,你就完成了(如果我们使用第二个接口的例子)。

这就是它的主要区别和优势。当您开始处理复杂的类层次结构,并且想要从这样的层次结构动态创建一个类的实例时,您会得到以下代码。然后工厂方法可能会接受一个参数,该参数告诉该方法实例化哪个具体实例。假设您有一个MyStudent类,并且需要实例化相应的ISchool对象,以便您的学生成为该学校的成员。

代码语言:javascript
复制
ISchool school = SchoolFactory.ConstructForStudent(myStudent);

现在,您的应用程序中有一个地方包含业务逻辑,该业务逻辑确定要为不同的IStudent对象实例化什么ISchool对象。

So -对于简单的类(值对象等)构造函数很好(您不想过度设计您的应用程序),但对于复杂的类层次结构,工厂方法是首选方法。

这样,您就遵循了gang of four book的第一个设计原则:“程序是接口,而不是实现”。

票数 241
EN

Stack Overflow用户

发布于 2009-03-10 07:26:10

您需要阅读(如果您有权阅读) Effective Java 2 第1项:考虑使用静态工厂方法而不是构造函数

静态工厂方法的优点:

  1. 它们有名称。
  2. 它们不需要在每次调用时创建新对象。
  3. 它们可以返回其返回类型的任何子类型的对象。
  4. 它们减少了创建参数化类型实例的繁琐。

<>G212>

静态工厂方法的缺点:

  1. 当只提供静态工厂方法时,没有公共或受保护构造函数的类不能是subclassed.
  2. They的,因此很难与其他静态方法区分
票数 79
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/628950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档