【设计模式-建造者模式】
时间:2022-07-24
本文章向大家介绍【设计模式-建造者模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上一篇说了工厂方法模式和抽象工厂模式,今来聊聊建造者模式。
一、定义
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
类似组将一台电脑,有主机、屏幕、鼠标、键盘等,你将这些组件的型号给组装店说好,他就会根据你的需求组装电脑,但是你不会看见具体的组装过程。
建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
二、实例
像上面说的电脑组装实例,就有三个对象,一个是电脑,一个是组装者,一个是客户。
电脑对象:
public class Computer {
private String screen;
private String keyboard;
private String mouse;
private String host;
//隐藏get、set方法
}
builder类:(相当于每个组件的购买者,具体组装过程是先装什么,后装什么,由组装者决定)
抽象builder类
public interface ComputerBuilder {
public void buildScreen(String screenName);
public void buildHost(String hostName);
public void buildKeyboard(String keyboardName);
public void buildMouse(String mouseName);
public Computer buildComputer();
}
实际builder类
public class ComputerActualBuilder implements ComputerBuilder {
Computer computer = new Computer();
@Override
public void buildScreen(String screenName) {
computer.setScreen(screenName);
}
@Override
public void buildHost(String hostName) {
computer.setHost(hostName);
}
@Override
public void buildKeyboard(String keyboardName) {
computer.setKeyboard(keyboardName);
}
@Override
public void buildMouse(String mouseName) {
computer.setMouse(mouseName);
}
@Override
public Computer buildComputer() {
return computer;
}
}
组装者:
public class Assembler {
ComputerBuilder computerBuilder;
public Assembler(ComputerBuilder computerBuilder) {
this.computerBuilder = computerBuilder;
}
public Computer buildComputer(String scrren,String mouse,String keyboard,String host){
computerBuilder.buildScreen(scrren);
computerBuilder.buildMouse(mouse);
computerBuilder.buildKeyboard(keyboard);
computerBuilder.buildHost(host);
return computerBuilder.buildComputer();
}
}
客户端:
ComputerBuilder computerBuilder = new ComputerActualBuilder();
Assembler assembler = new Assembler(computerBuilder);
Computer computer = assembler.buildComputer("三星屏幕", "雷蛇鼠标", "雷蛇键盘", "外星人主机");
客户只需说出具体需求,组装者就会帮忙组装好,客户并不需要知道具体的组装过程是如何的。
类图如下:
上面是有点复杂的版本,其实还有一个简单的版本,类似与StringBuilder的append方法。
就只有builder类还有电脑类:
比如:
public class Computer {
private String screen;
private String keyboard;
private String mouse;
private String host;
public Computer(ComputerBuilder builder) {
this.screen = builder.screen;
this.keyboard = builder.keyboard;
this.mouse = builder.mouse;
this.host = builder.host;
}
//隐藏get、set方法
static class ComputerBuilder{
private String screen;
private String keyboard;
private String mouse;
private String host;
1、每个建造方法都返回一个当前对象,这样就可以持续调用方法
public ComputerBuilder buildScreen(String screen){
this.screen = screen;
return this;
}
public ComputerBuilder buildKeyboard(String keyboard){
this.keyboard = keyboard;
return this;
}
public ComputerBuilder buildMouse(String mouse){
this.mouse = mouse;
return this;
}
public ComputerBuilder buildHost(String host){
this.host = host;
return this;
}
2、最后将当前对象作为参数构造Computer
public Computer build(){
return new Computer(this);
}
}
}
上面的使用方法如下:
Computer computer = new Computer.ComputerBuilder()
.buildMouse("雷蛇鼠标")
.buildHost("外星人主机")
.buildKeyboard("雷蛇键盘")
.buildScreen("三星屏幕").build();
System.out.println(computer);
交由静态内部类ComputerBuilder去实现建造过程。
三、源码实例
(1)StringBuffer和SpringBuilder的append方法就是建造者的
(2)代码中用TransportClient连接es的时候,需要设置连接属性的Settings,
ok,这个就是建造者模式!
希望能帮到你。
- 你不得不会的MarkDown
- 状态机的实现探讨
- Docker入门实战(二)——Docker镜像操作
- 使用强大的 Mockito 来测试你的代码
- java学习手册-CentOS 6.3(x86_32)下安装Oracle 10g R2
- Docker入门实战(三)——用Dockerfile构建镜像
- C++中消息自动派发之二 About IDL解析器
- C++中消息自动派发之三 About JSON Encode
- Linux管道命令
- Linux数据流重定向
- C++中消息自动派发之四 使用IDL构建Chat Server
- Linux Shell(二)——Shell的环境配置
- 支持插件的消息中间件【msg broker with plugin】
- Linux Shell(一)——Shell变量
- 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 数组属性和方法
- Guava集合--新集合类型
- 从 Node.js 到 Go
- 性能不达标,计将安出?
- Yaml 速成查询表
- 设计模式实战-策略模式,想让你的代码变幻莫测吗?
- 设计模式实战-模板模式,代码复用神器
- CSS Flexbox 布局完全指南 (二):3000字,多示例讲解
- 设计模式实战-访问者模式,减少代码体积
- Spring Security 实战干货:UsernamePasswordAuthenticationFilter 源码分析
- 打卡群刷题总结0715——旋转链表
- 设计模式实战-中介模式,为你牵桥搭线
- 设计模式实战-迭代器模式,最常用的设计模式之一
- 设计模式实战-解释器模式,今天给你解疑答惑
- 时间不再浪费评估上!ThingJS 3D可视化开发不用愁
- 设计模式实战-命令模式