定义

建造者模式,是将一个构建过程复杂的对象的构建过程和对象的表示分离,该模式主要关注的是构建过程。

角色

  • 产品(product):具体产品
  • 抽象建造者(abstract builder):创建一个产品对象的各个部件指定的接口/抽象类
  • 具体建造者(builder):实现接口,构建和装配各个部件
  • 指挥者(director):构建一个使用builder接口的对象。主要用于创建一个复杂的对象,它主要有两个作用:
    1. 隔离了客户与对象的生产过程
    2. 负责控制产品对象的生产过程

适用场景

  • 隔离复制的建造过程,相同的方法不同的执行顺序(不同执行顺序需要不同的construct方法或director)产生不同事件结果
  • 多个部件都可以装配到一个对象中,但产生的运行结果可能不相同(理解:不同的建造实现类的相同的实现方法的逻辑不同)
  • 初始化一个对象时,参数过多,或者很多参数具有默认值,见案例2
  • 建造者模式不适合创建差异性很大的产品类
    产品内部变化复杂,会导致需要定义很多具体建造者类实现变化,增加项目中类的数量,增加系统的理解难度和运行成本
  • 需要生成的产品对象有复杂的内部结构,这些产品对象具有共性,比如建房子,造自行车,每一种类型的基本组成相似

案例

建造房子

假设建造房子,无论是搭个茅草屋还是建造宫殿都需要打地基、建造墙壁,修建屋顶这几个步骤,代码如下

//产品类
public class House {private String basic;private String walls;private String roofed;// setter & getter
}
// 抽象建造者
public abstract class HouseBuilder {// 产品放在抽象建造者中,只能够创建一种产品,通过抽象方法定义该产品的不同表现方式protected House house = new House();public abstract void buildBasic();public abstract void buildWalls();public abstract void roofed();public House build() {return this.house;}
}
// 具体的建造类1 (茅草屋)
public class BandaHouseBuilder extends HouseBuilder {@Overridepublic void buildBasic() {house.setBasic("1m");System.out.println(" 茅草屋 地基一米 ");}@Overridepublic void buildWalls() {house.setWalls("5cm");System.out.println(" 茅草屋 墙厚度五厘米 ");}@Overridepublic void roofed() {house.setRoofed("茅草");System.out.println(" 茅草屋 盖上茅草 ");}
}
// 具体建造者2 (建造宫殿)
public class PalaceHouseBuilder extends HouseBuilder {@Overridepublic void buildBasic() {house.setBasic("10m");System.out.println(" 宫殿地基 10米");}@Overridepublic void buildWalls() {house.setWalls("50cm");System.out.println(" 宫殿 墙厚度 50厘米");}@Overridepublic void roofed() {house.setRoofed("琉璃瓦");System.out.println(" 宫殿 房顶用琉璃瓦");}
}
// 指挥者
public class HouseDirector {private HouseBuilder houseBuilder;public void setHouseBuilder(HouseBuilder houseBuilder) {this.houseBuilder = houseBuilder;}public House construct() {Assert.notNull(houseBuilder, "请指定具体的建造者");houseBuilder.buildBasic();houseBuilder.buildWalls();houseBuilder.roofed();return houseBuilder.build();}
}

配电脑(建造者模式解决初始化对象入参过多的问题)

  • 在下面例子中Computer是具体产品,Builder类充当的是具体建造者,客户端自己作为指挥者
  • jdk中StringBuilder和下面例子相似,StringBuilder.append()方法返回的是this,其中StringBuilder以及AbstractStringBuilder是建造者,接口Appendable是抽象建造者,指挥者也是使用append的客户端
public class Computer {private String cpu;private String screen;private String memory;private String mainboard;// 常规的方式用构造方法初始化public Computer(String cpu, String screen, String memory, String mainboard) {this.cpu = cpu;this.screen = screen;this.memory = memory;this.mainboard = mainboard;}// 建造者模式private Computer(Builder builder) {cpu = builder.cpu;screen = builder.screen;memory = builder.memory;mainboard = builder.mainboard;}// statis修饰目的:不需要初始化内部类// final修饰目的:不允许被继承,Builder是一个不可变类public static final class Builder {private String cpu;private String screen;private String memory;private String mainboard;public Builder() {}public Builder cpu(String val) {cpu = val;return this;}public Builder screen(String val) {screen = val;return this;}public Builder memory(String val) {memory = val;return this;}public Builder mainboard(String val) {mainboard = val;return this;}public Computer build() {return new Computer(this);}}
}
// 客户端调用
// 常规方式
Computer compter = new Computer("cpu", "screen", "memory", "mainboard");
// 建造者模式,比构造方法和set方法更为优雅
Computer compterBuilder = new Computer.Builder().cpu("cpu").screen("screen").memory("memory").mainboard("mainboard").build();

建造者模式 VS 工厂模式

  • 抽象工厂返回的是一系列相关的产品族,建造者模式创建的是一个组装后完整的产品
  • 抽象工厂由客户端实例化工厂,然后调用工厂方法获取自己需要的产品,建造者模式客户端不需要和建造者直接接触,而是通过指挥者知道如何生成对象;抽象工厂关注的是产品本身,建造者模式关注的是建造过程
  • 如果将抽象工厂看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车

参考

一篇文章就彻底弄懂建造者模式

设计模式-6-建造者模式相关推荐

  1. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  2. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  3. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  4. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

  5. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例

    本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...

  6. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  7. 学习《图说设计模式》建造者模式

    图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...

  8. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  9. java设计模式之建造者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  10. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

最新文章

  1. arcgis怎么压缩tif文件_地理工具学习--arcgis篇:单工具学习(1)
  2. JSP中base href=%=basePath%的作用
  3. js的oop方式和this指针问题
  4. ExtJS--Combobox多选相关(1)
  5. Cisco路由器上传和下载IOS
  6. 深入理解jvm虚拟机笔记
  7. matlab 如何查数据类型,MATLAB数据类型
  8. Android 自定义表格(第一行及第一列固定,其他列可滑动)
  9. 详解Python曲线拟合
  10. 兜兜转转,Image图片转换成PDF还是这款工具靠谱
  11. js实现oss批量下载文件_远程URL文件批量下载打包的方法
  12. 删除shipyard
  13. 谷歌浏览器自带网页截图快捷键
  14. 使用阿里云搭建自用大数据集群(3台),含计费方式描述
  15. 那个让你头大的数据结构,用Python学会变简单吗?
  16. 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
  17. windows RT开发笔记:WinRT DLL及其调用研究
  18. visual studio如何设置背景图片
  19. JAVA毕业设计BS景区票务管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  20. 练习项目(二):消融效果

热门文章

  1. FSA-Net学习笔记
  2. Http格林尼治时间和毫秒的相互转化EEE, dd MMM y HH:mm:ss 'GMT'
  3. 手机上的APP都是用什么编程语言写的?
  4. 追寻缺失的大学精神 一个民族需要关注天空的人
  5. Linux PCI驱动框架分析过程
  6. 大数据之Atlas元数据管理
  7. DxDiag中字段结构
  8. Linux文件目录操作命令 rm
  9. html直接使用marked.js解析marked文档
  10. 方舟仙境服务器什么时候修复,方舟生存进化官服多久删一次服务器