构建器模式

有三种方法可以用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)中所述的好处,您每次必须创建新对象时都应考虑使用构建器模式。

参考: Petri Kainulainen博客上我喜欢 JCG合作伙伴 Petri Kainulainen 的构建器模式的三个原因 。

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

构建器模式

构建器模式_我喜欢构建器模式的三个原因相关推荐

  1. 创建父需求子需求构建需求树_用pc构建DIY计算集群(超级计算机)

    ----------------------------------------------------------------- 用pc构建DIY计算集群 目录 /构建计算集群 0. |-- /0前 ...

  2. mesh 协调器 路由器_双模网络协调器、双模路由器和双模mesh组网系统的制作方法...

    双模网络协调器.双模路由器和双模mesh组网系统的制作方法 [技术领域] [0001]本实用新型涉及电子通信领域,特别涉及双模网络协调器.双模路由器.双模mesh组网系统. [背景技术] [0002] ...

  3. mesh 协调器 路由器_双模网络协调器、双模路由器、双模mesh组网系统及其方法与流程...

    本发明涉及mesh组网领域,特别涉及双模网络协调器.双模路由器.双模mesh组网系统及其方法. 背景技术: 无线mesh是一种非常适合于覆盖大面积开放区城(包括室外和室内)的无线区域网络解决方案.无线 ...

  4. mesh 协调器 路由器_关于zigbee协调器(单播方式)传输数据给网络中的多个路由器丢失数据包的问题?...

    问题描述:建立一个mesh网络,网络中只存在协调器和路由器节点,并不存在Endevice终端节点.整个网络大概存在20多个路由节点,一个协调器. 路由器节点和协调器都加入和NV存储,所以路由节点掉电后 ...

  5. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  6. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  7. h2 mysql模式_使用H2的MixedMode模式

    已经习惯在开发和演示环境使用h2来代替大号数据库很长时间了. Embedded 的启动方式,快速,小巧,该有的都有了,sql和oracle, db2,mysql兼容性都不错.唯一的问题是,Embedd ...

  8. io流,装饰者模式_流与装饰器

    io流,装饰者模式 几年前, Streams API随lambda表达式一起在Java 8中引入. 作为一名训练有素的Java专家,我尝试在我的一些项目中使用此新功能,例如here和here . 我真 ...

  9. python中的装饰器、装饰器模式_浅析Python装饰器以及装饰器模式

    漫谈 如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变. 我以前也看过很 ...

最新文章

  1. 读博无门,就业碰壁,孤独当了7个月“民科”后,他的论文中了顶会
  2. 洛阳中考实验计算机分数,2019洛阳中考总分是多少 录取分数线是多少
  3. Windows phone 7新开发工具发布
  4. WebKit 布局的标准和概念
  5. C# 开发圆角控件的具体实现
  6. 流水线的吞吐量,加速比,效率的计算
  7. 信息学奥赛一本通(1326:【例7.5】 取余运算(mod))
  8. 动态规划——How to Type(hdu2577)
  9. 大数据总监python可视化分析30W数据后,找到了抹黑我们的原因
  10. 笔记本安装linux无线网卡,笔记本安装centos7 无线网卡启动不起来,那位大神看看?...
  11. 2007年9月计算机等级,2007年9月第26次全国计算机等级考试总体安排
  12. 网易微专业IOS开发工程师教程(完整)
  13. 图像处理中的 亮度, 灰度, 对比度等概念
  14. Boosting三巨头:XGBoost、LightGBM和CatBoost(发展、原理、区别和联系,附代码和案例)
  15. YII Framework学习教程-YII的Model-开发规范-路径别名-命名空间-2011-11-22
  16. STM32学习笔记——CH340一键下载电路
  17. 区块链系统架构图_区块链模型架构
  18. 隐马尔科夫模型(HMM)算法的理解与超详细推导
  19. 国外中小学计算机老师待遇,美国中小学老师有职称评定吗?待遇如何?
  20. java实现将图片转换成ascii字符文本图像

热门文章

  1. 【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)
  2. 【背包】SMRTFUN
  3. 【并查集】【图论】【最小生成树】剑鱼行动(ssl 1618)
  4. laravel关闭crsf
  5. 这个点名系统太好用了,快来看看……
  6. php移动代码,移动专区周级收录如何提交 复制这段php代码即可
  7. pt939g联通_尝试修改友华PT939G的省份设置,成功!
  8. 使用IDEA Maven搭建Mybatis环境
  9. windows监控txt写入_Windows的bug们
  10. 转:运维监控系统-监控项及指标的梳理