设计模式——建造者模式
1- 建造者模式的定义
建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象,将复杂对象的构建与表示相分离,使得同样的构建过程可以创建不同的表示。
No BB,Show Code!
2- 建造者模式的具体代码实现
2-1复杂对象
为了更好的了解建造者模式,假设有一个复杂的对象Rocket,代码如下
package designPattern.test.builder.vo;
import java.io.Serializable;
/**
* 需要建造的复杂的对象:火箭
*/
public abstract class Rocket implements Serializable{
//多个助推器
private Assistor[] assistors;
//发动机
private Engine engine;
//整流罩
private Fairing fairing;
//火箭控制系统
private ControlSystem controlSystem;
public Assistor[] getAssistors() {
return assistors;
}
public void setAssistors(Assistor[] assistors) {
this.assistors = assistors;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Fairing getFairing() {
return fairing;
}
public void setFairing(Fairing fairing) {
this.fairing = fairing;
}
public ControlSystem getControlSystem() {
return controlSystem;
}
public void setControlSystem(ControlSystem controlSystem) {
this.controlSystem = controlSystem;
}
//火箭发射方法
public abstract void launch();
}
Rocket对象是由一个Assistor数组、一个Engine对象、一个Fairing对象以及一个ControlSystem对象组成,这4个部件的具体定义如下
Assistor:
package designPattern.test.builder.vo;
import java.io.Serializable;
/**
* 助推器类:建造Rocket的部件
*/
public class Assistor implements Serializable{
//直径
private double diameter;
//高度
private double height;
//推力大小
private double force;
public double getDiameter() {
return diameter;
}
public void setDiameter(double diameter) {
this.diameter = diameter;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getForce() {
return force;
}
public void setForce(double force) {
this.force = force;
}
}
Engine:
package designPattern.test.builder.vo;
import java.io.Serializable;
/**
* 火箭发动机:Rocket的组成部件
*/
public class Engine implements Serializable{
//材料
private String material;
//长
private double length;
//宽
private double width;
//高
private double height;
//重量
private double weight;
//动力
private double power;
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getPower() {
return power;
}
public void setPower(double power) {
this.power = power;
}
}
Fairing:
package designPattern.test.builder.vo;
import java.io.Serializable;
/**
* 整流罩:构建Rocket的组成部件
*/
public class Fairing implements Serializable {
//材质
private String material;
//燃点
private double firePoint;
//直径
private double diameter;
//颜色
private String color;
//重量
private double weight;
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
public double getFirePoint() {
return firePoint;
}
public void setFirePoint(double firePoint) {
this.firePoint = firePoint;
}
public double getDiameter() {
return diameter;
}
public void setDiameter(double diameter) {
this.diameter = diameter;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
ControlSystem
package designPattern.test.builder.vo;
import java.io.Serializable;
/**
* 控制系统:Rocket的组成部件
*/
public class ControlSystem implements Serializable {
//稳定性
private double stability;
//快速性
private double speedability;
//正确性
private double validity;
public double getStability() {
return stability;
}
public void setStability(double stability) {
this.stability = stability;
}
public double getSpeedability() {
return speedability;
}
public void setSpeedability(double speedability) {
this.speedability = speedability;
}
public double getValidity() {
return validity;
}
public void setValidity(double validity) {
this.validity = validity;
}
}
具体的产品——SpaceXFalconHeavy
package designPattern.test.builder.vo;
/**
* 具体的产品:重型猎鹰
*/
public class SpaceXFalconHeavy extends Rocket {
@Override
public void launch() {
System.out.println("SpaceX重性猎鹰发射....");
}
}
具体的产品——ChangZheng5
package designPattern.test.builder.vo;
/**
* 具体的产品:长征5号
*/
public class ChangZheng5 extends Rocket {
@Override
public void launch() {
System.out.println("5 4 3 2 1 长征5号发射成功!鼓掌....");
}
}
2-2Builder接口
package designPattern.test.builder.interf;
import designPattern.test.builder.vo.*;
/**
* Builder接口
*/
public interface RocketBuilder {
Assistor[] buildAssistors();
Engine buildEngine();
Fairing buildFairing();
ControlSystem buildControlSystem();
Rocket getRocket();
}
RocketBuilder接口定义了Rocket复杂对象各个部件的构造过程,最后通过getRocket()方法获取构造的复杂对象。
2-3具体对象的Builder类
SpaceXFalconHeavyBuilder
package designPattern.test.builder.interf.impl;
import designPattern.test.builder.interf.RocketBuilder;
import designPattern.test.builder.vo.*;
/**
* RocketBuilder具体的实现类
*/
public class SpaceXFalconHeavyBuilder implements RocketBuilder {
//构建助推器
@Override
public Assistor[] buildAssistors() {
Assistor[] assistors = new Assistor[2];
Assistor assistor = new Assistor();
assistor.setDiameter(3.6);
assistor.setHeight(36.0);
assistor.setForce(15600.0);
assistors[0] = assistor;
assistors[1] = assistor;
return assistors;
}
//构建发动机
@Override
public Engine buildEngine() {
Engine engine = new Engine();
engine.setLength(5.6);
engine.setHeight(3.2);
engine.setWidth(4.2);
engine.setMaterial("合金");
engine.setWeight(13.8);
engine.setPower(168000.0);
return engine;
}
//构建整流罩
@Override
public Fairing buildFairing() {
Fairing fairing = new Fairing();
fairing.setDiameter(5.6);
fairing.setFirePoint(2000.0);
fairing.setWeight(12.8);
fairing.setColor("white");
fairing.setMaterial("高强度碳纤维");
return fairing;
}
//构建控制系统
@Override
public ControlSystem buildControlSystem() {
ControlSystem controlSystem = new ControlSystem();
controlSystem.setStability(0.98);
controlSystem.setSpeedability(0.002);
controlSystem.setValidity(0.999);
return controlSystem;
}
//获取产品
@Override
public Rocket getRocket() {
Rocket rocket = new SpaceXFalconHeavy();
rocket.setAssistors(buildAssistors());
rocket.setEngine(buildEngine());
rocket.setFairing(buildFairing());
rocket.setControlSystem(buildControlSystem());
return rocket;
}
}
ChangZheng5Builder
package designPattern.test.builder.interf.impl;
import designPattern.test.builder.interf.RocketBuilder;
import designPattern.test.builder.vo.*;
/**
* 长征5号:中国长征家族重型火箭
*/
public class ChangZheng5Builder implements RocketBuilder {
//构建助推器
@Override
public Assistor[] buildAssistors() {
Assistor[] assistors = new Assistor[4];
Assistor assistor = new Assistor();
assistor.setDiameter(2.8);
assistor.setHeight(26.8);
assistor.setForce(12800.0);
assistors[0] = assistor;
assistors[1] = assistor;
assistors[2] = assistor;
assistors[3] = assistor;
return assistors;
}
//构建发动机
@Override
public Engine buildEngine() {
Engine engine = new Engine();
engine.setMaterial("耐高温合金");
engine.setWeight(10.8);
engine.setPower(108000.0);
engine.setLength(4.6);
engine.setHeight(2.8);
engine.setWidth(2.8);
return engine;
}
//构建整流罩
@Override
public Fairing buildFairing() {
Fairing fairing = new Fairing();
fairing.setDiameter(4.9);
fairing.setFirePoint(1500.0);
fairing.setWeight(10.8);
fairing.setColor("white");
fairing.setMaterial("高温陶瓷");
return fairing;
}
//构建控制系统
@Override
public ControlSystem buildControlSystem() {
ControlSystem controlSystem = new ControlSystem();
controlSystem.setStability(0.95);
controlSystem.setSpeedability(0.005);
controlSystem.setValidity(0.99);
return controlSystem;
}
//获取产品
@Override
public Rocket getRocket() {
Rocket rocket = new ChangZheng5();
rocket.setAssistors(buildAssistors());
rocket.setEngine(buildEngine());
rocket.setFairing(buildFairing());
rocket.setControlSystem(buildControlSystem());
return rocket;
}
}
3- 测试代码
package designPattern.test.builder;
import designPattern.test.builder.interf.RocketBuilder;
import designPattern.test.builder.interf.impl.ChangZheng5Builder;
import designPattern.test.builder.interf.impl.SpaceXFalconHeavyBuilder;
import designPattern.test.builder.vo.Rocket;
import org.junit.Test;
/**
* Builder模式测试
*/
public class BuilderTest {
@Test
public void testBuilder(){
RocketBuilder builder = new SpaceXFalconHeavyBuilder();
Rocket rocket = builder.getRocket();
rocket.launch();
RocketBuilder builder1 = new ChangZheng5Builder();
Rocket rocket1 = builder1.getRocket();
rocket1.launch();
}
}
综上:从测试代码可以看出,Builder模式将复杂对象的构造和表示相分离了,假设没有采用Builder模式,那么SpaceXFalconHeavy和ChangZheng5的构建过程将是非常繁杂的一堆new对象并set的过程,不美观且容易出错!Builder模式可以很好的解决这个问题!