专栏首页海加尔金鹰的专栏设计模式学习笔记之建造者模式

设计模式学习笔记之建造者模式

前言

这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结。 我的个人博客:海加尔金鹰

什么是建造者模式

在Java当中,当需要构建一个对象,并且这个对象的某些属性在构建好后有默认值或者自定义的值,通常有三种方法。 方法一:直接给属性一个默认值。缺点:不够灵活 方法二:通过构造器赋值。缺点:构造器的传参过多,不好分辨。 方式三:通过set方法赋值。缺点:如果需要设置的参数较多需要一个一个设置。 个人感觉的实际场景: 淘宝购物买电脑时经常看见的套餐,套餐一:鼠标+键盘,套餐二:鼠标+键盘+保护膜等很多的套餐。只需要选择套餐几就可以了,不需要一个一个选择。然后你觉得套餐里面的某个东西不喜欢,想换成其他的,还可以联系客服换。 然后就有了建造者模式。

1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2、主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 3、如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来) 4、解决的问题: (1)、方便用户创建复杂的对象(不需要知道实现过程) (2)、代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用) 5、注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序,一般用来创建更为复杂的对象 [^1]

上面是引用别人整理好的知识点。

建造者模式的实现

常见的四大角色

产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。[^2]

个人理解最核心的就是具体建造者(Concrete Builder)和产品角色(Product),在实际创建当中,具体建造者负责具体复杂对象创建,然后返回创建的对象(也就是产品)就可以看成一个简单的建造者模式。

代码实现

代码特征:链式编程,返回自身。 实现方式一:基于四大角色的方式 实现方式二:通过静态内部类方式实现零件无序装配话构造 具体代码见文章:Java 设计模式——建造者模式(Builder Pattern)

建造者模式的优缺点

优点

网上资料说了很多的优点,但是对我目前的感受来说,主要是:

  1. 不必关心具体的创建过程,我只需要传递相关参数信息,就可以返回我想要的具体实例。
  2. 相对于构造器创建对象,可以更加直观的看到参数和属性的关系,代码可读性更好。
  3. 不同的具体建造者之间相互独立,在进行扩展的时候就比较方便。

缺点

网上资料说了一些的缺点,我目前比较直观的感受只有一点:代码量相对来说变多了。

后记

  1. 在很多的资料当中都将建造者模式和工厂模式进行了对比分析,不过目前还没有仔细学习工厂模式,等学完了在进行比较。
  2. 在GitHub找到上一个不错的设计模式代码库:https://github.com/iluwatar/java-design-patterns
  3. 在quartz定时框架当中就用到了大量的建造者模式,例如 JobBuilder,TriggerBuilder,CronScheduleBuilder等等。在使用quartz的时候就很充分的感受到建造者模式的好处了。

[^1]:Java 设计模式——建造者模式(Builder Pattern) [^2]:建造者模式(Bulider模式)详解


标题:设计模式学习笔记之建造者模式 作者:海加尔金鹰 地址:https://www.hjljy.cn/articles/2019/07/04/1562252449091.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式学习笔记之过滤器模式

    在开发当中接触过很多的过滤器,或者使用过stream的filter方法就非常容易理解这个模式。

    海加尔金鹰
  • 设计模式学习笔记之工厂模式

    这是一篇学习笔记,内容很多是来源于网上的资料,然后按照自己学习情况进行的总结,有些是自身的感受,有些是网上比较好的资料的引用。 我的个人博客:海加尔金鹰

    海加尔金鹰
  • SpringBoot之文件批量上传和下载

    之前学习并使用过文件的单个上传:springboot学习日志之DAY08文件上传功能 最近写程序过程当中需要使用到批量上传和批量下载,批量和单个文件的上传下载...

    海加尔金鹰
  • Mybatis基于注解的案例 编写Dao实现类(实际开发不需要写)

    Mybatis通过 xml或注解的方式将要执行各种的statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的s...

    韦恩少爷的背
  • Redis Cluster 安装配置

    转载请务必注明原创地址为:http://dongkelun.com/2018/01/09/redisClusterDeployment/

    董可伦
  • 用单步异常检测OllyDbg的巧妙方法

    SEH大概算得上是WINDOWS下公开的秘密了,什么?您还不知道?没关系,下面我来简单地介绍一下。SEH即结构化异常处理(Structured Exceptio...

    战神伽罗
  • Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志

    这篇文章主要是参考Docker Logging via EFK (Elasticsearch + Fluentd + Kibana) Stack with Do...

    小歪
  • Golang语言--开发游戏服务器需要了解的知识

    我们以linux环境为列给大家讲解: 1 熟悉网络编程 网络编程主要是涉及到服务器与客户端间的通信,游戏开发中多数采用长链接的形式;短...

    李海彬
  • Java:前程似锦的 NIO 2.0

    Java 之所以能够霸占编程语言的榜首,其强大、丰富的类库功不可没,几乎所有的编程问题都能在其中找到解决方案。但在早期的版本当中,输入输出(I/O)流并不那么令...

    沉默王二
  • Java:前程似锦的 NIO 2.0

    Java 之所以能够霸占编程语言的榜首,其强大、丰富的类库功不可没,几乎所有的编程问题都能在其中找到解决方案。但在早期的版本当中,输入输出(I/O)流并不那么令...

    纯洁的微笑

扫码关注云+社区

领取腾讯云代金券