设计模式-6-建造者模式
定义
建造者模式,是将一个构建过程复杂的对象的构建过程和对象的表示分离,该模式主要关注的是构建过程。
角色
- 产品(product):具体产品
- 抽象建造者(abstract builder):创建一个产品对象的各个部件指定的接口/抽象类
- 具体建造者(builder):实现接口,构建和装配各个部件
- 指挥者(director):构建一个使用builder接口的对象。主要用于创建一个复杂的对象,它主要有两个作用:
- 隔离了客户与对象的生产过程
- 负责控制产品对象的生产过程
适用场景
- 隔离复制的建造过程,相同的方法不同的执行顺序(不同执行顺序需要不同的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-建造者模式相关推荐
- 建造者模式java_java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- Java设计模式(建造者模式-适配器模式-桥接模式)
Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- java设计模式 建造模式_理解java设计模式之建造者模式
理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...
- 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例
本文实例讲述了PHP设计模式之建造者模式.分享给大家供大家参考,具体如下: 建造者模式: 将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1). 来点我人类能听懂的话: 1.在客户端看来需 ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- 学习《图说设计模式》建造者模式
图说设计模式之建造者模式 1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这 ...
- 实践GoF的23种设计模式:建造者模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...
- java设计模式之建造者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
最新文章
- arcgis怎么压缩tif文件_地理工具学习--arcgis篇:单工具学习(1)
- JSP中base href=%=basePath%的作用
- js的oop方式和this指针问题
- ExtJS--Combobox多选相关(1)
- Cisco路由器上传和下载IOS
- 深入理解jvm虚拟机笔记
- matlab 如何查数据类型,MATLAB数据类型
- Android 自定义表格(第一行及第一列固定,其他列可滑动)
- 详解Python曲线拟合
- 兜兜转转,Image图片转换成PDF还是这款工具靠谱
- js实现oss批量下载文件_远程URL文件批量下载打包的方法
- 删除shipyard
- 谷歌浏览器自带网页截图快捷键
- 使用阿里云搭建自用大数据集群(3台),含计费方式描述
- 那个让你头大的数据结构,用Python学会变简单吗?
- 世界五百强中国上榜公司首次超过美国;现代汽车发布电动汽车品牌IONIQ | 美通企业日报...
- windows RT开发笔记:WinRT DLL及其调用研究
- visual studio如何设置背景图片
- JAVA毕业设计BS景区票务管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
- 练习项目(二):消融效果