建造者模式是日常開發中比較常見的設計模式,它的主要作用就是講複雜事務創建的過程抽象出來,該抽象的不同實現方式,創建出的對象也不同。
通俗地講,創建一個對象一般都會有一個固定的步驟,這個固定的步驟我們把它抽象出來。
建造者模式分爲兩種:
- 經典建造者模式
- 變種建造者模式
經典建造者模式
UML類圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pIuNyKwS-1591857099537)(file:///Users/yangmingyue/Documents/Gridea/post-images/1590993459408.jpg)]
四個角色:
- Product – 產品
- Builder – 抽象的步驟
- ConcreteBuilder – Builder具體的實現
- Director – 使用者
代碼:
public class Computer {
/*CPU*/
private String CPU;
/*內存*/
private String memory;
/*硬盤*/
private String hardDisk;
/*鍵盤*/
private String keyboard;
/*鼠標*/
private String mouse;
public String getCPU() {
return CPU;
}
public void setCPU(String CPU) {
this.CPU = CPU;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getHardDisk() {
return hardDisk;
}
public void setHardDisk(String hardDisk) {
this.hardDisk = hardDisk;
}
public String getKeyboard() {
return keyboard;
}
public void setKeyboard(String keyboard) {
this.keyboard = keyboard;
}
public String getMouse() {
return mouse;
}
public void setMouse(String mouse) {
this.mouse = mouse;
}
@Override
public String toString() {
return "Computer{" +
"CPU='" + CPU + '\'' +
", memory='" + memory + '\'' +
", hardDisk='" + hardDisk + '\'' +
", keyboard='" + keyboard + '\'' +
", mouse='" + mouse + '\'' +
'}';
}
}
Builder 類:
public interface ComputerConfigBuilder {
void setCPU();
void setMemery();
void setHardDisk();
void setKeyboard();
void setMouse();
Computer getComputer();
}
具體實現:
public class LowConfigBuilder implements ComputerConfigBuilder {
private Computer mComputer;
public LowConfigBuilder(){
this.mComputer = new Computer();
}
@Override
public void setCPU() {
mComputer.setCPU("i5");
}
@Override
public void setMemery() {
mComputer.setMemory("8G");
}
@Override
public void setHardDisk() {
mComputer.setHardDisk("500G");
}
@Override
public void setKeyboard() {
mComputer.setKeyboard("薄膜鍵盤");
}
@Override
public void setMouse() {
mComputer.setMouse("有線鼠標");
}
@Override
public Computer getComputer() {
return mComputer;
}
}
Director:
public class Director {
private ComputerConfigBuilder mBuilder;
public void setBuilder(ComputerConfigBuilder builder){
this.mBuilder = builder;
}
public void createComputer(){
mBuilder.setCPU();
mBuilder.setMemery();
mBuilder.setHardDisk();
mBuilder.setKeyboard();
mBuilder.setMouse();
}
public Computer getComputer(){
return mBuilder.getComputer();
}
}
Test:
Director director = new Director();//創建裝機人員
director.setBuilder(new LowConfigBuilder()); //告訴裝機人員電腦配置,這裏爲低配版
director.createComputer(); //裝機人員開始組裝
Computer computer = director.getComputer(); //從裝機人員獲取組裝好的電腦
System.out.print("電腦配置:" + computer.toString()); //查看電腦配置
director.setBuilder(new HighConfigBuider());
director.createComputer();
Computer computer = director.getComputer();
System.out.print("電腦配置:" + computer.toString());
變種Builder模式
代碼:
public class Person {
/*名字(必須)*/
private final String name;
/*性別(必須)*/
private final String gender;
/*年齡(非必須)*/
private final String age;
/*鞋子(非必須)*/
private final String shoes;
/*衣服(非必須)*/
private final String clothes;
/*錢(非必須)*/
private final String money;
/*房子(非必須)*/
private final String house;
/*汽車(非必須)*/
private final String car;
/*職業(非必須)*/
private final String career;
private Person(Builder builder) {
this.name = builder.name;
this.gender = builder.gender;
this.age = builder.age;
this.shoes = builder.shoes;
this.clothes = builder.clothes;
this.money = builder.money;
this.house = builder.house;
this.car = builder.car;
this.career = builder.career;
}
public static class Builder {
private final String name;
private final String gender;
private String age;
private String shoes;
private String clothes;
private String money;
private String house;
private String car;
private String career;
public Builder(String name,String gender) {
this.name = name;
this.gender = gender;
}
public Builder age(String age) {
this.age = age;
return this;
}
public Builder car(String car) {
this.car = car;
return this;
}
public Builder shoes(String shoes) {
this.shoes = shoes;
return this;
}
public Builder clothes(String clothes) {
this.clothes = clothes;
return this;
}
public Builder money(String money) {
this.money = money;
return this;
}
public Builder house(String house) {
this.house = house;
return this;
}
public Builder career(String career) {
this.career = career;
return this;
}
public Person build(){
return new Person(this);
}
}
Test:
Person person = new Person.Builder("張三","男")
.age("12")
.money("1000000")
.car("寶馬")
.build();