建造者模式
將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
建造模式是將複雜的內部創建封裝在內部,對於外部調用的人來說,只需要傳入建造者和建造工具,對於內部是如何建造成成品的,調用者無需關心。
分類
抽象建造者(Abstract Builder)角色:給出一個抽象解耦,以規範產品對象的各個組成成分建造。具體建造者類必須實現這個接口鎖要求的兩種方法:一種是建造方法,另一種是結果返還方法。有多少零件就應該有多少建造方法。
具體建造者(Concrete Builder)角色:擔任這個角色的是與應用程序緊密相關的一些類,它們在應用程序調用下創建產品實例。它要完成的任務包括:
A.實現抽象建造者鎖聲明的接口,給出一步一步地完成創建產品實例的操作;
B.在建造完成之後,提供產品實例。
導演者(Director)角色:調用具體建造者角色以創建產品對象,它與客戶端打交道。
產品(Product)角色:它是建造中的複雜對象。
簡單實例
抽象建造者:
public interface Builder {
public void createFloor();
public void createWall();
public void createRoof();
public void createWindow();
}
真實建造者:
中式風格建造
public class ChinaWorker implements Builder {
public House house = new ChinaHouse();
@Override
public void createFloor() {
house.setFloor(" create china Floor ");
}
@Override
public void createRoof() {
house.setRoof(" create china Roof ");
}
@Override
public void createWall() {
house.setWall(" create china Roof ");
}
@Override
public void createWindow() {
house.setWindow(" create china Window ");
}
@Override
public House getHouse() {
return house;
}
}
英式風格建造者public class EnglishWorker implements Builder {
public House house = new EnglishHouse();
@Override
public void createFloor() {
house.setFloor(" create english Floor ");
}
@Override
public void createRoof() {
house.setRoof(" create english Roof ");
}
@Override
public void createWall() {
house.setWall(" create english Roof ");
}
@Override
public void createWindow() {
house.setWindow(" create english Window ");
}
@Override
public House getHouse() {
return house;
}
}
產品:
public class House {
public String floor;
public String wall;
public String roof;
public String window;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoof() {
return roof;
}
public void setRoof(String roof) {
this.roof = roof;
}
public String getWindow() {
return window;
}
public void setWindow(String window) {
this.window = window;
}
}
public class ChinaHouse extends House {
}
public class EnglishHouse extends House {
}
導演:
public class Designer {
public void command(Builder builder) {
builder.createFloor();
builder.createRoof();
builder.createWall();
builder.createWindow();
}
}
客戶端:
public class Client {
public static void main(String[] args) {
Builder builder = new ChinaWorker();
House house = new Designer().command(builder);
System.out.println(house.window);
builder = new EnglishWorker();
house = new Designer().command(builder);
System.out.println(house.window);
// create china Window
// create english Window
}
}