設計模式——建造者模式
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模式可以很好的解決這個問題!