04 设计模式 建造者模式
时间:2022-07-22
本文章向大家介绍04 设计模式 建造者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
建造者模式
建造者模式就好像盖一栋房子,需要有设计师,图纸,施工队以及成品,
在这其中:
- 设计师负责确定流程
- 图纸是一个施工的描述
- 施工队是具体的动作
- 成品是最后的结果
图例如下:
成品类:
@Data
@ToString
public class Product {
String buildA = "默认值A";
String buildB = "默认值B";
String buildC = "默认值C";
String buildD = "默认值D";
}
上面的成品类就是最终的产品所需要具备的属性,我把它理解为实体类
图纸类:
public abstract class Builder {
abstract Builder buildA(String msg);
abstract Builder buildB(String msg);
abstract Builder buildC(String msg);
abstract Builder buildD(String msg);
abstract Product getProduct();
}
Builder就是一个对施工队的抽象,也就在一个工程中所需要的步骤,没有具体的实现
施工队类:
public class Worker extends Builder{
Product product;
Worker(){product = new Product();}
@Override
Builder buildA(String msg) {
product.setBuildA(msg);
return this;
}
@Override
Builder buildB(String msg) {
product.setBuildB(msg);
return this;
}
@Override
Builder buildC(String msg) {
product.setBuildC(msg);
return this;
}
@Override
Builder buildD(String msg) {
product.setBuildD(msg);
return this;
}
@Override
Product getProduct() {return product;}
}
施工队类是Builder的实现类,确定了Builder中步骤的具体操作
导演类:
public class Director {
public static Product build(Builder builder){
return builder.getProduct();
}
public static Product build(Builder builder, String msg1){
builder.buildA(msg1).getProduct();
return builder.getProduct();
}
public static Product build(Builder builder, String msg1, String msg2){
return builder.buildA(msg1).buildB(msg2).getProduct();
}
public static Product build(Builder builder, String msg1, String msg2, String msg3){
return builder.buildA(msg1).buildB(msg2).buildC(msg3).getProduct();
}
public static Product build(Builder builder, String msg1, String msg2, String msg3, String msg4){
return builder.buildA(msg1).buildB(msg2).buildC(msg3).buildD(msg4).getProduct();
}
}
其用于指导具体的施工队如何施工,控制先后次序等
测试类:
public static void main(String[] args) {
System.out.println(Director.build(new Worker()));
System.out.println(Director.build(new Worker(),"这是第一个参数"));
System.out.println(Director.build(new Worker(),"这是第一个参数","这是第二个参数"));
System.out.println(Director.build(new Worker(),"这是第一个参数","这是第二个参数","这是第三个参数"));
System.out.println(Director.build(new Worker(),"这是第一个参数","这是第二个参数","这是第三个参数","这是第四个参数"));
}
}
结果如下:
Product{buildA='默认值A', buildB='默认值B', buildC='默认值C', buildD='默认值D'} Product{buildA='这是第一个参数', buildB='默认值B', buildC='默认值C', buildD='默认值D'} Product{buildA='这是第一个参数', buildB='这是第二个参数', buildC='默认值C', buildD='默认值D'} Product{buildA='这是第一个参数', buildB='这是第二个参数', buildC='这是第三个参数', buildD='默认值D'} Product{buildA='这是第一个参数', buildB='这是第二个参数', buildC='这是第三个参数', buildD='这是第四个参数'}
- 46. 实现一个简单的网络爬虫 | 厚土Go学习笔记
- 45. sync.Mutex 互斥和互斥锁 | 厚土Go学习笔记
- golang进度条
- 44. goroutine、channel、time的例子 | 厚土Go学习笔记
- AVL二叉树
- Golang:使用 httprouter 构建 API 服务器
- dataguard中需要注意的一些数据文件操作(r8笔记第21天)
- 42. select 的默认分支 | 厚土Go学习笔记
- 执行计划变化导致CPU负载高的问题分析 (r8笔记第20天)
- 数据结构基础(2) --顺序查找 ; 二分查找
- 数据结构基础(1) --Swap ; Bubble-Sort ; Select-Sort
- 使用 Go 语言完成 HTTP 文件上传与下载
- 运维平台的建设思考-元数据管理(四)(r8笔记第16天)
- JavaWeb21-基础加强(注解;代理;类加载器;泛型反射
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 重复读取 HttpServletRequest 中 InputStream 的方法
- 测试面试题集锦(三)| 计算机网络和数据库篇(附答案)
- 关于Scikit-Learn你(也许)不知道的10件事
- 技术天地 | CSS-in-JS:一个充满争议的技术方案
- 安全研究 | 通过域名劫持实现Azure DevOps账户劫持
- 一款针对DLL劫持的恶意DLL生成器
- AuthMatrix:一款针对Web应用和服务的认证安全检测BurpSuite工具
- KITT-Lite:基于Python实现的轻量级命令行渗透测试工具集
- 一次KimSuky攻击事件分析
- OpenCV中如何使用滚动条动态调整参数
- 一文读懂「分布式架构」
- 老哥,您看我这篇Java集合,还有机会评优吗?
- 在 IDEA 中使用 Java 热部署插件 JRebel
- 后端必备 Git 分支开发:规范指南
- 大量的 TIME_WAIT 状态连接怎么处理?(文末有福利)