Java建造者模式原型和鏈式變種
阿新 • • 發佈:2018-11-05
建造者最開始有4個角色
1.使用者client,提出造房子 Room的需求
2.設計者,Designer,出圖紙,指揮包工頭幹,持有包工頭
3.包工頭, interface Build,擁有步驟和返回房子Room
4.Room,最終的產品
程式碼從client開始
public class Client {
//client 客戶提出需求,造房子,並得到房子
//不關心過程和建造邏輯
public static void main(String[] args) {
//1.提供具體建造者
WorkerBuilder worker=new WorkerBuilder();
//2.設計指導者
Desinger designer=new Desinger();
//3.準備開始建造
Room room=designer.preparBuild(worker);
//4.建造完成,驗收
System.out.println("room建造完成:"+room.toString());
}
}
從上面可以很好的看出,client提出到最後得到,可以完全省掉 了建造邏輯和過程,這就是最初的建造者模式模型。
下面是包工頭和具體工人實現
public interface Build {
**//抽象 建造者,包工頭**
void makeWindow();
void makeFloor();
Room build();
}
public class WorkerBuilder implements Build {
//**具體建造者 工人worker持有房子引用**
Room room=new Room();
@Override
public void makeWindow() {
// TODO Auto-generated method stub
room.setWindow("透明玻璃窗戶!" );
}
@Override
public void makeFloor() {
// TODO Auto-generated method stub
room.setFloor("義大利地板");
}
@Override
public Room build() {
// TODO Auto-generated method stub
return room;
}
}
public class Desinger {
//設計師出圖紙,管理著具體建造者
public Room preparBuild(Build builder) {
//指揮工人施工
builder.makeFloor();
builder.makeWindow();
return builder.build();
}
}
public class Room {
//產品類,room,最紅返回給client
private String window;
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
private String floor;
@Override
public String toString() {
return "Room [window=" + window + ", floor=" + floor + "]";
}
總結:然後因為Room的欄位都是public,對外開放,使用者可以看得到呼叫並修改建造過程,這不是最好的方式。只是最初的簡單原型。
下面是建造者模式變形之後的的模型圖
對比第一張圖,去掉了抽象建造者,既是包工頭interface Build;
去掉了 設計師傅,designer,可以抽象的來說,這個變形就是具體實施工人 自己直接接活了
public class Client {
//client 客戶提出需求,造房子,並得到房子
//不關心過程和建造邏輯
public static void main(String[] args) {
//1.提供具體建造者,鏈式程式設計
Room room=new WorkerBuilder().makeFloor("光滑地板").makeWindow("透明視窗").build();
//4.建造完成,驗收
System.out.println("room建造完成:"+room.toString());
}
}
public class Room {
//產品類,room,最紅返回給client
private String window;
private String floor;
/**
* 隱藏set 和get 之後真正的構建過程
* @param roomParams
* @return
*/
public Room freshRoom(RoomParams roomParams) {
this.window=roomParams.window;
this.floor=roomParams.floor;
return this;
}
@Override
public String toString() {
return "Room [window=" + window + ", floor=" + floor + "]";
}
}
public class WorkerBuilder {
//具體建造者 工人worker持有房子引用
Room room=new Room();
RoomParams roomParams=new RoomParams();
public WorkerBuilder makeWindow(String windowStyle) {
roomParams.setWindow(windowStyle);
return this;
}
public WorkerBuilder makeFloor(String floorStyle) {
roomParams.setFloor(floorStyle);
return this;
}
public Room build() {
// TODO Auto-generated method stub
return room.freshRoom(roomParams);
}
class RoomParams{
public String window;
public void setWindow(String window) {
this.window = window;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String floor;
}
}