如何构造函数与工厂方法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

当建模类时,初始化的首选方法是什么:

  1. 构造人,或
  2. 工厂方法

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

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

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

提问于
用户回答回答于

在以下情况下使用工厂方法模式

  • 类无法预测它必须创建的对象类
  • 类希望它的子类指定它创建的对象。
  • 类将责任委托给几个助手子类中的一个,您希望本地化哪些助手子类是委托的知识。
用户回答回答于

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

ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside

到目前为止没有区别。现在假设我们有不同的学校类型,我们想要从使用ElementarySchool切换到高中(这是从ElementarySchool派生出来的,或者实现了与ElementarySchool相同的接口iSchool)。代码更改将是:

HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside

如果有一个接口,我们将拥有:

ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside

现在,如果您在多个地方都有这段代码,您可以看到使用工厂方法可能非常便宜,因为一旦您更改了工厂方法,就可以完成(如果我们使用第二个带有接口的示例)。

假设您有一个MyStudent类,您需要实例化相应的iSchool对象,以便您的学生是该学校。

ISchool school = SchoolFactory.ConstructForStudent(myStudent);

现在,您在应用程序中有一个位置,它包含业务逻辑,该逻辑确定要为不同的IStudy对象实例化哪个iSchool对象。

扫码关注云+社区