建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离。Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。
模式的使用场景
1.相同的方法,不同的执行顺序,产生不同的事件结果时;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
UML图如下
以组装一台电脑为例。电脑分为低配和高配,每台电脑又具备cpu、Ram(内存)、tv(显示器)、keyBoard(键盘)、mouse(鼠标)这几个基本的零件组成。
电脑类如下
package com.example.buildDemo;
/**
* description
* <p>
* 电脑基类
* @author slliao
* @date 2019/5/6 10:24.
*/
public class Computer {
private String cpu;
private String Ram;
private String tv;
private String keyBoard;
private String mouse;
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getRam() {
return Ram;
}
public void setRam(String ram) {
this.Ram = ram;
}
public String getTv() {
return tv;
}
public void setTv(String tv) {
this.tv = tv;
}
public String getKeyBoard() {
return keyBoard;
}
public void setKeyBoard(String keyBoard) {
this.keyBoard = keyBoard;
}
public String getMouse() {
return mouse;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
@Override
public String toString() {
return "Computer{" +
"cpu='" + cpu + '\'' +
", Ram='" + Ram + '\'' +
", tv='" + tv + '\'' +
", keyBoard='" + keyBoard + '\'' +
", mouse='" + mouse + '\'' +
'}';
}
}
定义一个组装电脑的接口
package com.example.buildDemo;
/**
* description
* <p>
*
* @author slliao
* @date 2019/5/6 10:19.
*/
public interface BuildComputer {
/**
* 加cpu
*/
void addCpu();
/**
* 加内存条
*/
void addRam();
/**
* 加显示器
*/
void addTv();
/**
* 加键盘
*/
void addKeyboard();
/**
* 加显示器
*/
void addMouse();
/**
* 取电脑数据
* @return
*/
Computer getComputer();
}
定义一个低配版本的电脑
package com.example.buildDemo;
/**
* description
* <p>
* 低配版
* @author slliao
* @date 2019/5/6 10:23.
*/
public class LowComputer implements BuildComputer{
private Computer computer;
public LowComputer() {
this.computer = new Computer();
}
@Override
public void addCpu() {
computer.setCpu("i3");
}
@Override
public void addRam() {
computer.setRam("4G");
}
@Override
public void addTv() {
computer.setTv("普通屏幕");
}
@Override
public void addKeyboard() {
computer.setKeyBoard("普通键盘");
}
@Override
public void addMouse() {
computer.setMouse("普通鼠标");
}
@Override
public Computer getComputer() {
return computer;
}
}
定义一个高配版的电脑
package com.example.buildDemo;
/**
* description
* <p>
* 高配版
* @author slliao
* @date 2019/5/6 10:23.
*/
public class HighLevelComputer implements BuildComputer{
private Computer computer;
public HighLevelComputer(){
this.computer=new Computer();
}
public void setComputer(Computer computer) {
this.computer = computer;
}
@Override
public void addCpu() {
computer.setCpu("i7");
}
@Override
public void addRam() {
computer.setRam("16G");
}
@Override
public void addTv() {
computer.setTv("高级屏幕");
}
@Override
public void addKeyboard() {
computer.setKeyBoard("高级机械键盘");
}
@Override
public void addMouse() {
computer.setMouse("高级鼠标");
}
@Override
public Computer getComputer() {
return computer;
}
}
测试类如下
package com.example.buildDemo;
/**
* description
* <p>
*
* @author slliao
* @date 2019/5/6 10:36.
*/
public class Test {
public static void main(String[] args) {
//创建组装人员
Builder builder = new Builder();
//低配版对象
LowComputer lowComputer = new LowComputer();
//告诉组装人员创建低配版电脑
builder.setBuildComputer(lowComputer);
//开始组装电脑
builder.CreateComputer();
Computer computer = builder.getComputer();
//输出配置
System.out.println("电脑配置为:"+computer);
//创建组装人员
Builder builder2 = new Builder();
//低配版对象
HighLevelComputer highLevelComputer = new HighLevelComputer();
//告诉组装人员创建高配版电脑
builder.setBuildComputer(highLevelComputer);
//开始组装电脑
builder.CreateComputer();
Computer computer2 = builder.getComputer();
//输出配置
System.out.println("电脑配置为:"+computer2);
}
}
结果为:
这种是基本的建造者使用方法,以后会遇到@build这个标签,这种是属于变种的建造者模式。
参考文献:https://www.jianshu.com/p/afe090b2e19c
https://blog.youkuaiyun.com/hjxgood/article/details/70316562