一、基本介紹
建造者模式(建立型):指将一個複雜對象的構造與它的表示分離,使同樣的建構過程可以建立不同的表示,它是将一個複雜的對象分解為多個簡單的對象,然後一步一步建構而成。它将變與不變相分離,即産品的組成部分是不變的,但每一部分是可以靈活選擇的。
二、包含角色
1.指揮者:它調用建造者對象中的部件構造與裝配方法完成複雜對象的建立,即建構搭建步驟。
2.産品角色:包含多個組成部件的複雜對象,由具體建造者來建立其各個部件,即最終建構出來的複雜對象。
3.抽象建造者:它是一個包含建立産品各個子部件的抽象方法的接口,也包含某些通用部件的建構方法。
4.具體建造者:實作抽象建造者接口,完成複雜産品的各個部件的具體建立方法。
三、案例及UML類圖
案例說明:
目前需要建立一台電腦,按照步驟從裡到外建構每一個元件,最後把它生産出來即可,當然每個廠商的電腦都是大同小異,建造步驟是相同,但具體細節不一定相同。
方式一:有指揮者
UML類圖:
類AbstractComputerBulider:
public abstract class AbstractComputerBulider {
protected Computer computer = new Computer();
public abstract void createCpu();
public abstract void createBrand();
public abstract void createSize();
public abstract void createSystem();
/**
* 因為電壓都相同,是以直接在父類設定
*/
public void createPower() {
computer.setPower(220);
}
public abstract void createShell();
public Computer buliderComputer() {
//隻傳回對象,具體建構過程由指揮者把控,職責劃分。
return computer;
}
}
說明:抽象電腦建造者,抽象建造者,定義了建構産品的步驟以及通用方法。
類Computer:
public class Computer {
//品牌
private String brand;
//尺寸大小
private String size;
//電源
private Integer power;
//cpu
private String cpu;
//外殼
private String shell;
//系統
private String system;
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public String getShell() {
return shell;
}
public void setShell(String shell) {
this.shell = shell;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public Integer getPower() {
return power;
}
public void setPower(Integer power) {
this.power = power;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
}
說明:電腦類,産品角色,最終建立出來的産品。
類Director:
public class Director {
private AbstractComputerBulider bulider;
public Director(AbstractComputerBulider bulider) {
this.bulider = bulider;
}
public Computer bulider() {
bulider.createBrand();
bulider.createPower();
bulider.createSize();
bulider.createCpu();
bulider.createSystem();
//最後才建構外殼
bulider.createShell();
return bulider.buliderComputer();
}
}
說明:指揮者,用于建構建造産品的步驟。
類DaiErComputerBuilider:
public class DaiErComputerBuilider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("戴爾");
}
@Override
public void createSize() {
computer.setSize("15.6");
}
@Override
public void createSystem() {
computer.setSystem("win10");
}
@Override
public void createShell() {
computer.setShell("金屬拉絲");
}
}
說明:戴爾電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。
類HuaWeiComputerBulider:
public class HuaWeiComputerBulider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("華為");
}
@Override
public void createSize() {
computer.setSize("14");
}
@Override
public void createSystem() {
computer.setSystem("Deepin linux");
}
@Override
public void createShell() {
computer.setShell("塑膠外殼");
}
}
說明:華為電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。
類BuliderTest1:
public class BuliderTest1 {
public static void main(String[] args) {
//建構華為電腦
Director huaWeiDirector = new Director(new HuaWeiComputerBulider());
Computer huaWeiComputer = huaWeiDirector.bulider();
System.out.println(huaWeiComputer.getBrand());
//建構戴爾電腦
Director daiErDirector = new Director(new DaiErComputerBuilider());
Computer daiErComputer = daiErDirector.bulider();
System.out.println(daiErComputer.getBrand());
}
}
說明:測試及用戶端。
方式二:無指揮者
UML類圖:
類AbstractComputerBulider:
public abstract class AbstractComputerBulider {
protected Computer computer = new Computer();
public abstract void createCpu();
public abstract void createBrand();
public abstract void createSize();
public abstract void createSystem();
/**
* 因為電壓都相同,是以直接在父類設定
*/
public void createPower() {
computer.setPower(220);
}
public abstract void createShell();
public Computer buliderComputer() {
//建構步驟,充當指揮者的角色,違背了單一職責原則
createBrand();
createPower();
createSize();
createCpu();
createSystem();
//最後才建構外殼
createShell();
return computer;
}
}
說明:抽象電腦建造者,抽象建造者,定義了建構産品的步驟以及通用方法,并且兼職了指揮者角色,在建造時定義了建構步驟。
類Computer:
public class Computer {
//品牌
private String brand;
//尺寸大小
private String size;
//電源
private Integer power;
//cpu
private String cpu;
//外殼
private String shell;
//系統
private String system;
public String getSystem() {
return system;
}
public void setSystem(String system) {
this.system = system;
}
public String getShell() {
return shell;
}
public void setShell(String shell) {
this.shell = shell;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public Integer getPower() {
return power;
}
public void setPower(Integer power) {
this.power = power;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
}
說明:電腦類,産品角色,最終建立出來的産品。
類DaiErComputerBuilider:
public class DaiErComputerBuilider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("戴爾");
}
@Override
public void createSize() {
computer.setSize("15.6");
}
@Override
public void createSystem() {
computer.setSystem("win10");
}
@Override
public void createShell() {
computer.setShell("金屬拉絲");
}
}
說明:戴爾電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。
類HuaWeiComputerBulider:
public class HuaWeiComputerBulider extends AbstractComputerBulider {
@Override
public void createCpu() {
computer.setCpu("i5");
}
@Override
public void createBrand() {
computer.setBrand("華為");
}
@Override
public void createSize() {
computer.setSize("14");
}
@Override
public void createSystem() {
computer.setSystem("Deepin linux");
}
@Override
public void createShell() {
computer.setShell("塑膠外殼");
}
}
說明:華為電腦建造者,具體建造者,實作抽象建造者中的抽象建構方法。
類BuliderTest2:
public class BuliderTest2 {
public static void main(String[] args) {
//建構華為電腦
AbstractComputerBulider huaWeiBulider= new HuaWeiComputerBulider();
Computer huaWeiComputer = huaWeiBulider.buliderComputer();
System.out.println(huaWeiComputer.getBrand());
//建構戴爾電腦
AbstractComputerBulider daiErBulider = new DaiErComputerBuilider();
Computer daiErComputer = daiErBulider.buliderComputer();
System.out.println(daiErComputer.getBrand());
}
}
說明:測試及用戶端類。
四、适用場景
1.适用于建立的對象較複雜,由多個部件構成,各部件面臨着複雜的變化,構件間的建造順序是穩定的,最終産品的差異化較小。
五、兩種方式對比
方式一優缺點:
優:包含4個角色每個覺得職責劃分很合理,沒有違背單一職責原則。
缺:劃分得太細需要建立的類過于多,使用過程變複雜。
方式二優缺點:
優:少建立類,使用過程變簡單。
缺:違背單一職責原則
注意:一般使用方式二比較多,即使違背單一職責,但沒有把代碼複雜化,當然也可以使用方式一。