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='这是第四个参数'}
- .NET Core多平台开发体验[3]: Linux (Windows Linux子系统)
- .NET Core多平台开发体验[2]: Mac OS X
- .NET Core多平台开发体验[1]: Windows
- 如何远程关闭一个ASP.NET Core应用?
- 【深度学习】谷歌deepdream原理及tensorflow实现
- 【深度学习】写诗机器人tensorflow实现
- PyTorch还是TensorFlow?这有一份新手指南
- Leetcode 300. Longest Increasing Subsequence
- Leetcode 299. Bulls and Cows
- Leetcode 297. Serialize and Deserialize Binary Tree
- Leetcode 295. Find Median from Data Stream
- 投入大见效慢,还要做AI?
- Leetcode 292. Nim Game
- Leetcode 290. Word Pattern
- 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 数组属性和方法
- PyQt5 技巧篇-按钮竖排显示方法,Qt Designer设置按钮竖排显示。
- Kafka集群监控、安全机制与最佳实践
- PyQt5 技术篇-设置输入框的placeholder方法,Qt Designer设置Line Edit、Text Edit编辑框的placeholder
- Kafka集群搭建及必知必会
- Python 技术篇-打开指定文件夹、目录、路径方法,运行指定文件演示
- Python 技巧篇-同一个方法多次引用不同效果功能实现,可选参数设置方法
- Kafka核心API——Connect API
- PyQt5 技术篇-设置alignment对齐方式。Qt Designer设置文本对齐方式。居中、左对齐、右对齐、上对齐、下对齐。
- Nginx部署Vue项目以及解决刷新页面404
- Kafka核心API——Stream API
- Kafka核心API——Consumer消费者
- Kafka核心API——Producer生产者
- Linux Lab v0.5 正式发布,功能强大,用法简单
- Kafka核心API——AdminClient API
- PyQt5 技术篇-调用颜色对话框(QColorDialog)获取颜色,调色板的调用。