建造者模式(Builder Pattern)属于创建型模式的一种,将多个简单对象构建成一个复杂的对象,构建过程抽象化,不同实现方法可以构造出不同表现(属性)的对象,还提供了一种更加优雅构建对象的方式…

概述

有时候构建一个复杂的对象,需要经过好几步的处理,比如常用的StringBuffer、StringBuilder、以及Swagger(一种接口文档),都是以这种模式构建对象的

优点

  • 建造者模式比较独立,将对象本身与构建过程解耦
  • 精准控制构建出的对象和内容,构造层和显示层是分离的
  • 写法上更加优雅

缺点

  • 范围受限,不适合差异较大的对象
  • 内部复杂多变,构造类相对会多

适用场景

  • 构建具有共同特性的复杂对象

相关模式

抽象工厂模式与建造者模式相似,因为它也可以创建复杂对象。主要的区别是建造者模式着重于一步步得构造出复杂对象。而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的)。建造者是在最后的一步返回对象,而对于抽象工厂来说,对象是立即返回的。

案例

传统方式

public class Summoner {private String name;private String type;private String innate;public Summoner(String name, String type, String innate) {this.name = name;this.type = type;this.innate = innate;}
}

简单的对象我们可以使用下面这种方式,因为属性较少这种方式还看的,但不幸的是如果要增加字段或我们还需要去扩展构造方法,且可读性不好,相同类型的情况下在一定程度上混淆视听了

Summoner s1 = new Summoner("德玛","战士","战争雷霆");

为什么不调用无参数的构造函数,通过setter方法来减轻问题。

解答: 如果程序员忘记调用一个特定的setter方法会发生什么?我们可能得到的是一个部分初始化的对象,而且编译器也不会检测出任何问题。

  • 构造函数参数太多
  • 错误的对象状态

使用模式

在我们的示例中,改造下召唤师类

public class Summoner {private String name;private String type;private String innate;private Summoner(Builder builder) {this.name = builder.name;this.type = builder.type;this.innate = builder.innate;}protected static class Builder {private String name;private String type;private String innate;protected Builder name(String name) {this.name = name;return this;}protected Builder type(String type) {this.type = type;return this;}protected Builder innate(String innate) {this.innate = innate;return this;}protected Summoner build() {return new Summoner(this);}}
}public class BuilderDemo {public static void main(String[] args) {Summoner monkey = new Summoner.Builder().name("齐天大圣 - 孙悟空").type("上单 - AD").innate("基石天赋 - 战争雷霆").build();System.out.println(monkey.toString());Summoner mouse = new Summoner.Builder().name("瘟疫之源 - 图奇").type("下路 - ADC").innate("基石天赋 - 战阵热诚").build();System.out.println(mouse.toString());Summoner diann = new Summoner.Builder().name("皎月女神 - 戴安娜").type("中单 - AP").build();System.out.println(diann.toString());}
}

建造者模式让我们写的代码更具可读性,可理解为建立复杂的物体。它往往是实现一个连贯的操作,从而更加直观,此处由于类型较为单一差距不大,但遇到复杂对象构建差距就立竿见影了

Summoner{name='齐天大圣 - 孙悟空', type='上单 - AD', innate='基石天赋 - 战争雷霆'}
Summoner{name='瘟疫之源 - 图奇', type='下路 - ADC', innate='基石天赋 - 战阵热诚'}
Summoner{name='皎月女神 - 戴安娜', type='中单 - AP', innate='null'}

总结

我们通过一个简单的代码例子开始,慢慢变得复杂。然后使用Builder模式来解决我们发现的问题。

如果你发现自己在一个情况下,你不断添加新参数的构造函数,使得代码变得容易出错,很难读,也许可以考虑使用一个Builder重构你的代码。

推荐

  • lombok: https://github.com/rzwitserloot/lombok
  • IntelliJ IDEA : InnerBuilder 插件

- 说点什么

全文代码:https://gitee.com/battcn/design-pattern/tree/master/Chapter4/battcn-builder

  • 个人QQ:1837307557
  • battcn开源群(适合新手):391619659

微信公众号:battcn(欢迎调戏)

一起学设计模式 - 建造者模式相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  3. 设计模式 建造者模式_设计模式:建造者

    设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...

  4. 设计建造者模式java代码,Java设计模式-建造者模式

    定义 Separate the construction of a complex object from its representation so that the sameconstructio ...

  5. python创造者_python 设计模式-建造者模式

    问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...

  6. java设计模式-建造者模式

    概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...

  7. 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...

    11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...

  8. 大话设计模式—建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...

  9. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

最新文章

  1. 麦肯锡AI应用报告:深度学习是蓝海还是深坑?
  2. photoshop(ps) cs6中文版
  3. 查询数据库游标使用情况以及sql
  4. oracle对象之触发器
  5. 如何使用小程序自定义组件功能
  6. 事务不是与当前连接无关联就是已完成_mysql索引锁事务
  7. Jasmine基础API
  8. 阿里云服务器价格表:第7代云服务器ECS收费价格表
  9. matlab 彩色图片分解,MATLAB 彩色图像分割
  10. mysql实现oracle的同义词_Oracle 同义词synonym 学习
  11. 32位计算机的内存限额,32位系统支持多大内存 如何完全使用32位4G内存
  12. 关于SIR模型性质的进一步摘录
  13. 2010爆牙笑话第一季!【转】
  14. 如何将caj转换成word?caj转Word工具
  15. 【背包问题】基于matlab禁忌搜索算法求解背包问题【含Matlab源码 373期】
  16. LifecycleOwner xx is attempting to register while current state is RESUMED. LifecycleOwners must cal
  17. 地形因子分类整合方案
  18. 单目标跟踪算法调研(2019)
  19. nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression
  20. java 过滤关键字 自定义字典库

热门文章

  1. python的价值观_Python beauthulsoup刮刮雅虎财经价值观
  2. 微赞html写入,微赞WZ-后台一键更新-授权
  3. Tk_Batis 介绍和用法以及和Jpa 的区别
  4. Leetcode501. Morris中序遍历
  5. python中符号的用法_python中的@符号的作用
  6. 3000万存款的陈奕迅哭穷,真不是无病呻吟!
  7. 解决steam 上origin 安装超级慢的问题 [已解决]
  8. 基于JAVA学生健康管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
  9. 零基础做算法?清华计算机系学长带你斩获大厂算法校招SSP
  10. php丢失msvcr110.dll,计算机中丢失MSVCR110.dll的解决办法