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

构建器模式

有三种方法可以用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

构建器模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何分辨PoE工业交换机是否标准供电

要了解如何分辨出一台PoE交换机/PoE工业交换机是否是标准PoE供电,首先得要弄清楚什么是PoE交换机/PoE工业交换机。接下来我们就跟随飞畅科技的小编一起来详细了解下吧! PoE供电交换机是指能够通过网线为远端受电终端提供网络供电的交换机,包…

android 蒙层广告1,subnvue安卓机打开只显示蒙层,没有任何内容【报Bug】

详细问题描述subnvue子窗体,在iphone上测试正常,而在安卓手机测试出现打开只有一个灰色蒙层,没有任何内容。经过调试之后发现:"style": {"top": "0px","bottom": "0px","…

【渝粤教育】 国家开放大学2020年春季 3956★汽车故障诊断技术 参考试题

试卷代号:3979 座位号 2 0 2 0年春季学期期末统一考试 会计学概论 试题 2020年7月 一、单项选择题(在下列各题的备选答案中选择一个正确的,并将其序号字母填入题中的括号里,每小题2分,共20分) 1&#xff0e…

【渝粤教育】 国家开放大学2020年春季 1007公司财务 参考试题

试卷代号:1013 2 0 2 0年春季学期期末统一考试 金融统计分析 试题(开卷) 2020年7月 一、单项选择题(每小题2分,共40分。每小题有一项答案正确,请将正确答案的序号填在括号内) 1.中央…

工业交换机出现故障问题排查步骤详解

工业交换机虽然说具有电信级性能特征,可耐受严苛的工作环境,但是其运行中出现故障问题是不可避免的,当工业交换机出现故障后应当迅速地进行处理,尽快查出故障点,排除故障。在遇到故障分析较复杂时,必须先从…

layui datetimepicker 只日期范围到当前时间的前一天_浪琴手表如何正确调整日期?手表调日期的方法...

浪琴手表怎么样?先看下品牌知识浪琴表起源于1832年,由一位年青商人Auguste Agassiz创办。他以自己的名字在瑞士Saint-Imier开始经营钟表生意,其后,他的侄儿Ernest Francillon巧妙地把其业务拓展为较具规模的钟表公司,于1866年在瑞…

android studio ignore 模板,android studio git ignore

android studio 集成的git图形界面并不灵敏,希望更依赖shell命令1.该项目已有git仓库,打算换地址,或者重新做git命令.删除当前项目app文件夹下.git文件* 打开项目,进入Terminal命令行* git init 初始化当前项目本地仓库* 在APP文件夹下,打开.gitignore文件,书写以下内容# built…

【渝粤教育】 国家开放大学2020年春季 1013金融统计分析 参考试题

试卷代号:1020 2 0 2 0年春季学期期末统一考试 国际私法 试题 2020年7月 一、单项选择题(每题2分,共20分,每题只有一项答案正确,请将正确答案的序号填在括号内) 1.法律的域外效力也称为( &#…

尚未提交线上版本_ABRSM 线上演奏考试报名指引(目前考试仅限英国 amp; 部分国家及地区)...

昨天,ABRSM英国公布了2021年英国本土和亚洲部分地区演奏、乐理的“线上、线下”报名及考试时间,虽然中国大陆的考试时间为“待定”状态,但为了满足考生和家长了解线上演奏考试报名流程,今天我们就为大家作一个详尽的线上考试报名指…

【渝粤教育】 国家开放大学2020年春季 1021劳动与社会保障法 参考试题

试卷代号:1026 座位号□□ 2 0 2 0年春季学期期末统一考试 西方经济学(本) 试题 2020年7月 一、单项选择题(每题2分,共30分,请将你认为的正确答案的序号填入该题后的括号内) 1.-般来…

关于以太网光纤收发器,逻辑隔离与物理隔离的理解与区别

现如今,随着以太网的广泛应用,在很多领域,比如说电力、银行、公安、部队、铁路、大型企事业单位专网有广泛物理隔离的以太网接入需求,但是什么是物理隔离以太网呢?什么又是逻辑隔离以太网呢?我们该如何判断…

android studio zlib,在Android Studio 3.1中构建项目时出现“压缩执行失败”错误

我正在尝试在Android Studio 3.1预览版中构建https://github.com/neural-nuts/Cam2Caption,但是我使用的是很旧的build.gradle,或者它死于Error:Execution failed for task :Application:packageDebug.Execution of compression failed.在清理项目或重建…

【渝粤教育】 国家开放大学2020年春季 1039高级财务会计 参考试题

试卷代号:1044 座位号 2 0 2 0年春季学期期末统一考试 合同法 试题 2020年7月 一、单项选择题(每小题1分,共10分。在每小题的四个备选答案选出一个正确的答案,请将正确答案的序号填在括号内) 1.合同根据其成…

javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第2部分

javafx 自定义控件自从我开始创建Nest恒温器FX自定义控件以来,已经有一段时间了! 因此,上次,正如Gerrit Grunwald所建议的那样,我花了一些时间使用inkscape复制Nest恒温器设计,这是构建JavaFX版本的第一步。…

初中参观机器人博物馆的作文_展馆导览机器人好不好用?小笨展馆机器人案例...

每次科技发展都会给社会带来技术变革,例如工业革命时代的纺纱机,发电机等,极大地提高了生产效率,推动了社会的进步。二十一世纪,人工智能成为了当下技术变革的排头兵,机器人作为其载体已经被应用在各类展馆…

【渝粤教育】 国家开放大学2020年春季 1054流通概论 参考试题

试卷代号:1062 2 0 2 0年春季学期期末统一考试 文学英语赏析 试题 2020年7月 注 意 事 项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考…

3G-SDI光端机产品技术参数规格及产品应用领域

3G-SDI系列光端机性能稳定、画质清晰、稳定性高,并带LED状态指示,可直观地观察光端机的工作状态,适合SDI视频监控和远距离视频采集。接下来我们就来为大家详细介绍下3G-SDI光端机产品技术参数规格及产品应用领域,一起来看看吧&…

android studio多屏幕,为多个屏幕实现多个布局但在android studio 2.1中无法工作

什么你应该做的是规模上的一切你根据屏幕尺寸显示屏幕。例如:如果你有一个TextView,你可以这样做:TextView myTextView (TextView) findViewById(R.id.myTextView_ID);int tempSize myTextView.getTextSize();myTextView.setSize(TypedValu…

【渝粤教育】 国家开放大学2020年春季 1069中央银行理论与实务 参考试题

试卷代号:1073 2 0 2 0年春季学期期末统一考试 法律文书 试题 2020年7月 注意事项 一、将你的学号、姓名及分校(工作站)名称填写在答题纸的规定栏内。考试结束后,把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完…

通过WAD和Docker热部署Java Enterprise

我已经录制了一个视频,该视频介绍了如何使用Adam Bien和Docker容器使用Watch and Deploy (WAD)来最大程度地缩短开发周转时间。 WAD工具监视文件更改,并将重新构建我们的应用程序并将其重新部署到自动部署目录。 我们将看到如何将…