构建器模式_我喜欢构建器模式的三个原因

构建器模式

有三种方法可以用Java编程语言创建新对象:

  1. 伸缩构造函数(反)模式
  2. Javabeans模式
  3. 建造者模式

与其他两种方法相比,我更喜欢使用构建器模式。

为什么?

Joshua Bloch描述了构建器模式以及在Effective Java中使用它的好处。 他的工作非常出色,在这篇博客文章中,我将不再重复这些好处。

取而代之的是,我将描述为什么我更喜欢构建器模式而不是伸缩构造器模式和Javabeans模式的三个其他原因。

1.帮助您进行更好的设计

使用伸缩构造函数模式或Javabeans模式意味着必须在创建实际对象之前创建所创建对象的属性。

这可能是问题,也可能不是问题。

如果使用外部服务获取创建的对象的属性,则不会有问题。 但是,如果属性是在创建“目标”对象的方法中创建的,则会出现问题。

在后一种情况下,创建的对象的生命周期通常绑定到“目标”对象的生命周期。

在这种情况下,构建器模式可以帮助您使用称为聚合的域驱动设计(DDD)模式。 Martin Fowler指定聚合模式如下:

DDD聚合是域对象的群集,可以将它们视为一个单元。 一个示例可能是订单及其订单项,它们将是单独的对象,但是将订单(连同其订单项)视为一个单独的集合很有用。

构建器模式可以帮助您以将域模型划分为聚合的方式来设计代码。 这意味着属于聚合的所有对象都是由聚合根对象(订单)创建的,并且只能通过聚合根对象进行访问。

这将构造关系与逻辑关系移到它所属的地方。

2.让你思考

以传统方式编写代码很容易,因为您无需思考。 您所要做的就是编写将信息从一个地方复制到另一个地方的代码。 可能要花一些时间,但这对您来说不是问题,因为您处于舒适区。

也许您只是想处理代码而不考虑自己在做什么。

我不是那样的人(你也不应该那样)。

构建器模式迫使您考虑对象。 更具体地说,它迫使您考虑以下事项:

  • 您必须找出对象的必需和可选属性。
  • 您必须确定将生命周期绑定到所创建对象的生命周期的属性,并设计构建器,以便其强调这一点。
  • 您必须确定在创建对象后不能更新哪些属性(并将这些属性标记为最终属性)。
  • 您必须决定可以更新哪些属性,并找到更新它们的最佳方法。

找到这些问题的答案有助于您编写更好的代码。 我可以保证,如果您花时间找到这些问题的答案,您的代码将比自动驾驶仪上编写的代码好得多。

3.它帮助您创建特定于域的语言

如果使用伸缩构造器模式或Javabeans模式创建新对象,则很难在代码中添加业务含义。 您可以按照以下原则尝试改善情况:

  • 您可以向构造函数参数添加业务含义的唯一方法是以适当的方式命名参数。 这很难做到,即使您做对了,结果也不是最佳的。
  • 如果使用设置器,则当然可以用一种添加设置器方法的方式来命名它们。 但是,您有多少次看到以该原理命名的setter方法?

在100个对象中,有99个创建的对象只是没有意义的对象。 他们保存数据。 就这些。

使用构建器模式时,可以通过命名构建器类的方法来创建用于创建新对象的域特定语言(DSL) 。 这可以帮助您在创建新对象的代码中添加业务含义。

这就提出了一个问题:如何更新对象的属性?

当然,您可能会很无聊,并使用setter方法来更新对象的各个属性。 但是您也可以做一些完全不同的事情。

您可以将这些属性分组为有意义的组,而不用更新单个属性,并且可以通过一种方法更新这些属性的值。 如果正确命名此方法,则可以创建DSL来更新现有对象的信息。

这不是银弹

布雷克•考德威尔(Blake Caldwell)表示, 对于构造器来说,构造器模式本质上不太容易出错 。 我同意他的观点。

当您开始使用构建器模式时,首先要注意的是创建新对象的代码更易于编写和阅读。 但是,一段时间后,您可能还会注意到其他好处。 我知道我做到了。

但是,重要的是要了解构建器模式不是灵丹妙药

我认为, 没有人会因为一种最佳实践而遵循最佳实践 。 这也适用于构建器模式。

如果您的对象只有几个构造函数参数,则使用构建器模式没有任何意义。 但是,由于此博客文章(和Effective Java)中所述的好处,您每次必须创建新对象时都应考虑使用构建器模式。


翻译自: https://www.javacodegeeks.com/2014/02/three-reasons-why-i-like-the-builder-pattern.html

构建器模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值