1. 程式人生 > >Java建造者模式原型和鏈式變種

Java建造者模式原型和鏈式變種

建造者最開始有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;
    }
}