为了账号安全,请及时绑定邮箱和手机立即绑定

构造函数与工厂方法

构造函数与工厂方法

湖上湖 2019-08-26 09:25:51
构造函数与工厂方法建模类时,首选的首选方法是什么:构造者,或工厂方法使用其中任何一个会有什么考虑因素?在某些情况下,我更喜欢有一个工厂方法,如果无法构造对象,则返回null。这使代码整洁。在执行替代操作之前,我可以简单地检查返回的值是否为null,与从构造函数中抛出异常相反。(我个人不喜欢例外)比如说,我在类上有一个构造函数,它需要一个id值。构造函数使用此值从数据库填充类。如果不存在具有指定标识的记录,则构造函数将抛出RecordNotFoundException。在这种情况下,我将不得不在try..catch块中包含所有这些类的构造。与此相反,我可以在这些类上有一个静态工厂方法,如果找不到记录,它将返回null。在这种情况下,哪种方法更好,构造函数或工厂方法?
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

来自Gamma,Helm,Johnson和Vlissides的“ 设计模式:可重复使用的面向对象软件的元素”的第108页

使用Factory Method模式时

  • 类无法预测它必须创建的对象类

  • 一个类希望它的子类指定它创建的对象

  • 类将责任委托给几个辅助子类之一,并且您希望本地化哪个辅助子类是委托的知识


查看完整回答
反对 回复 2019-08-26
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

除了“有效的java”(在另一个答案中提到),另一本经典书也暗示:

首选静态工厂方法(使用描述参数的名称)来重载构造函数。

例如。不要写

Complex complex = new Complex(23.0);

而是写

Complex complex = Complex.fromRealNumber(23.0);

本书甚至建议将Complex(float)构造函数设为私有,以强制用户调用静态工厂方法。


查看完整回答
反对 回复 2019-08-26
?
弑天下

TA贡献1818条经验 获得超8个赞

有时您必须在创建对象时检查/计算某些值/条件。如果它可以抛出异常 - constructro是非常糟糕的方式。所以你需要做这样的事情:

var value = new Instance(1, 2).init()public function init() {
    try {
        doSome()
    }
    catch (e) {
        soAnotherSome()
    }}

所有其他计算都在init()中。但只有你作为开发人员真正了解这个init()。当然,几个月之后你就会忘记它。但是如果你有一个工厂 - 只需要在一个方法中完成所有你需要的东西,直接调用隐藏这个init() - 所以没有问题。使用这种方法不会导致创建和内存泄漏。

有人告诉你有关缓存的信息。很好。但是你还必须记住Flyweight模式,它很适合与Factory方式一起使用。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 676 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信