特性介紹
- 適合構建複雜對象。
- 分離了對象子組件的單獨構造和裝配,實現了構建和裝配的解耦。
- 客戶端不必知道產品內部組成的細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象。
示例說明
場景描述
以電腦的生產裝配過程爲例,假設一個電腦由顯卡、主板和機箱組成,電腦的組件建造和裝配由不同的接口控制,具體的實現類負責實際操作。
調用關係圖
示例代碼
1.新建電腦類和電腦的三個組件類
/**
* 電腦類
*/
public class Computer {
private GraphicsCrd graphicsCrd;
private Mainboard mainboard;
private Crate crate;
public GraphicsCrd getGraphicsCrd() {
return graphicsCrd;
}
public void setGraphicsCrd(GraphicsCrd graphicsCrd) {
this.graphicsCrd = graphicsCrd;
}
public Mainboard getMainboard() {
return mainboard;
}
public void setMainboard(Mainboard mainboard) {
this.mainboard = mainboard;
}
public Crate getCrate() {
return crate;
}
public void setCrate(Crate crate) {
this.crate = crate;
}
}
/**
* 顯卡類
*/
public class GraphicsCrd{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public GraphicsCrd(String name) {
this.name = name;
}
}
/**
* 主板類
*/
public class Mainboard{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Mainboard(String name) {
this.name = name;
}
}
/**
* 機箱類
*/
public class Crate{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Crate(String name) {
this.name = name;
}
}
2.新建電腦組件建造接口及其實現類
/**
* 電腦組件建造接口
*/
public interface ComputerBuilder {
//建造顯卡方法
GraphicsCrd buildGraphicsCrd();
//建造主板方法
Mainboard buildMainboard();
//建造機箱方法
Crate buildCrate();
}
/**
* 電腦組件建造實現類
*/
public class FanyiComputerBuilder implements ComputerBuilder {
@Override
public GraphicsCrd buildGraphicsCrd() {
return new GraphicsCrd("泛亦牌顯卡");
}
@Override
public Mainboard buildMainboard() {
return new Mainboard("泛亦牌主板");
}
@Override
public Crate buildCrate() {
return new Crate("泛亦牌機箱");
}
}
3.新建電腦裝配接口及實現類
/**
* 電腦裝配接口
*/
public interface ComputerDirector {
//電腦裝配方法
Computer directorComputer();
}
/**
* 電腦裝配實現類
*/
public class FanyiComputerDirector implements ComputerDirector{
private ComputerBuilder builder;
public FanyiComputerDirector(ComputerBuilder builder) {
this.builder = builder;
}
@Override
public Computer directorComputer() {
Computer computer = new Computer();
computer.setGraphicsCrd(builder.buildGraphicsCrd());
computer.setMainboard(builder.buildMainboard());
computer.setCrate(builder.buildCrate());
return computer;
}
}
4.新建客戶端/調用者
/**
* 客戶端/調用者類
*/
public class Client {
public static void main(String[] args) {
ComputerDirector fanyiDirector = new FanyiComputerDirector(new FanyiComputerBuilder());
Computer comp = fanyiDirector.directorComputer();
System.out.println("顯卡:" + comp.getGraphicsCrd().getName() +
" 主板:" + comp.getMainboard().getName() +
" 機箱:" + comp.getCrate().getName());
}
}