建造者模式
建造者模式屬於創建型設計模式,用來組裝複雜的實例
定義:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示
建造者模式是一步一步創建一個複雜的對象,它允許用戶只通過指定複雜對象的類型和內容就可以構建它們,用戶不需要知道內部的具體構建細節
模式類圖
角色
- 抽象建造者:Builder,目的是爲了將建造的具體過程交給它的子類來實現。這樣更容易擴展。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品
- 具體的建造者: ConcreteBuilder,實現抽象建造者的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品
- 產品類:Product,一般是一個較爲複雜的對象
- 管理類:Director,負責調用適當的建造者來組建產品,被用來封裝程序中易變的部分
優點
- 客戶端不必知道產品內部組成的細節,封裝性好
- 建造者獨立,容易擴展
以電腦爲例,電腦擁有cpu,內存,硬盤,涉及的類:Builder(抽象建造者),ConcreteBuilder(具體的建造者),Computer(產品類),Director(管理類)
抽象建造者
public abstract class Builder {
/**
* 組裝cpu
*/
public abstract void builderCpu(String cpu);
/**
* 組裝內存
*/
public abstract void builderMemory(String memory);
/**
* 組裝硬盤
*/
public abstract void builderDisk(String disk);
/**
* 獲取電腦
* @return
*/
public abstract Computer getComputer();
}
具體的建造者
public class ConcreteBuilder extends Builder {
private Computer computer = new Computer();
@Override
public void builderCpu(String cpu) {
computer.setCpu(cpu);
}
@Override
public void builderMemory(String memory) {
computer.setMemory(memory);
}
@Override
public void builderDisk(String disk) {
computer.setDisk(disk);
}
@Override
public Computer getComputer() {
return computer;
}
}
產品類
@Data
public class Computer {
private String cpu;
private String memory;
private String disk;
}
主管類
public class Director {
private Builder builder = new ConcreteBuilder();
/**
* 組裝電腦
*/
public Computer builderComputer(String cpu, String memory, String disk){
builder.builderCpu(cpu);
builder.builderMemory(memory);
builder.builderDisk(disk);
return builder.getComputer();
}
}
測試
public static void main(String[] args) {
Director director = new Director();
Computer computer = director.builderComputer("Intel cpu","內存","硬盤");
System.out.println(computer);
}
輸出
Computer(cpu=Intel cpu, memory=內存, disk=硬盤)
建造者模式與工程方法模式的不同在於建造者模式關注的是零件類型和裝配工藝(順序)
建造者模式還有種更常見的使用方式:
使用靜態內部類
public class Cache {
private final String name;
private final String condition;
protected Cache(Builder b) {
this.name = b.name;
this.condition = b.condition;
}
public String getName() {
return name;
}
public String getCondition() {
return condition;
}
public static class Builder {
private String name = "";
private String condition = "";
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setCondition(String condition) {
this.condition = condition;
return this;
}
public Cache build(){
return new Cache(this);
};
}
}
使用時:
new Cache.Builder().setName("cmy").setCondition("condition").build();