西部資料推出 Elements SE 移動固態硬碟:讀取 400MB/s,最大 2TB
阿新 • • 發佈:2021-09-20
建造者模式
-
建造者模式典型應用場景:包工頭安排工人建一桌房子,產品需要的材料 地基,鋼鐵,材料
-
程式碼實現關鍵點 包工頭物件、工人物件、產品物件、建造者物件:
-
有包工頭指揮工人的實現程式碼如下
- 建造者物件,包含材料及實現
package com.gof23.builder1.demo1; public abstract class Builder { public abstract void builderA(); public abstract void builderB(); public abstract void builderC(); public abstract Room getRoom(); }
- 房子物件
package com.gof23.builder1.demo1; public class Room { private String builderA ; public String getBuilderA() { return builderA; } public void setBuilderA(String builderA) { this.builderA = builderA; } public String getBuilderB() { return builderB; } public void setBuilderB(String builderB) { this.builderB = builderB; } public String getBuilderC() { return builderC; } public void setBuilderC(String builderC) { this.builderC = builderC; } private String builderB; private String builderC; @Override public String toString() { return "Room{" + "builderA='" + builderA + '\'' + ", builderB='" + builderB + '\'' + ", builderC='" + builderC + '\'' + '}'; } }
- 工人物件
package com.gof23.builder1.demo1; public class Worker extends Builder { private Room room; public Worker(){ this.room = new Room(); } @Override public void builderA() { this.room.setBuilderA("A"); } @Override public void builderB() { this.room.setBuilderB("M"); } @Override public void builderC() { this.room.setBuilderC("C"); } public Room getRoom() { return room; } }
- 包工頭物件
package com.gof23.builder1.demo1;
public class Directory {
public Room builder(Builder builder){
builder.builderB();
builder.builderA();
builder.builderC();
return builder.getRoom();
}
}
- client測試實現包工頭指揮工人造房子
package com.gof23.builder1.demo1;
public class Client {
public static void main(String[] args) {
Directory directory = new Directory();
Room room = directory.builder(new Worker());
System.out.println(room.toString());
}
}
- 無包工頭,老闆或者客戶直接指揮工人造房子實現程式碼如下
- 建造者物件,包含材料及實現
package com.gof23.builder1.demo1;
public abstract class Builder {
public abstract Builder builderA(String msg);
public abstract Builder builderB(String msg);
public abstract Builder builderC(String msg);
public abstract Room getRoom();
}
- 房子物件
package com.gof23.builder1.demo1;
public class Room {
private String builderA ;
public String getBuilderA() {
return builderA;
}
public void setBuilderA(String builderA) {
this.builderA = builderA;
}
public String getBuilderB() {
return builderB;
}
public void setBuilderB(String builderB) {
this.builderB = builderB;
}
public String getBuilderC() {
return builderC;
}
public void setBuilderC(String builderC) {
this.builderC = builderC;
}
private String builderB;
private String builderC;
@Override
public String toString() {
return "Room{" +
"builderA='" + builderA + '\'' +
", builderB='" + builderB + '\'' +
", builderC='" + builderC + '\'' +
'}';
}
}
- 工人物件
package com.gof23.builder1.demo2;
public class Worker extends Builder {
private Room room;
public Worker(){
this.room = new Room();
}
@Override
public Builder builderA(String msg) {
this.room.setBuilderA(msg);
return this;
}
@Override
public Builder builderB(String msg) {
this.room.setBuilderB(msg);
return this;
}
@Override
public Builder builderC(String msg) {
this.room.setBuilderC(msg);
return this;
}
public Room getRoom() {
return room;
}
}
- client測試模擬實現直接指揮工人造房子,這種方式更靈活,建房子的材料及步驟都可控制
package com.gof23.builder1.demo2;
public class Client {
public static void main(String[] args) {
Room room = new Worker().builderA("水泥地").builderC("MMM").builderB("sdfsdfsdf").getRoom();
System.out.println(room.toString());
}
}
小結: 1. 建造者模式應用比較框,底層框架用的也比較多
2. 實現指揮者的建造者模式相對無實現指揮者的建造者模式更笨拙點,只能由具體的指揮者或包工頭來定義建房子的材料及步驟,而無實現具體指揮者的,client測試模擬實現直接指揮工人造房子,這種方式更靈活,建房子的材料及步驟都可控制
推薦方式2