建造者模式(builder)是建立一個複雜對象的建立型模式,將構建複雜對象的過程和它的部件解耦,使得構建過程和部件的表示分離開來。html
建造者模式角色:java
抽象建造者(Builder)角色:給出一個抽象接口,以規範產品對象的各個組成成分的建造。通常而言,此接口獨立應用程序的商業邏輯。模式中直接建立產品對象的是具體建造者(ConcreteBuilder)角色。具體建造者類必須實現這個接口所要求的兩種方法:一種是建造方法(buildPart1和buildPart2),另外一種是返還結構方法(retrieveResult)。通常來講,產品所包含的零件數目與建造方法的數目相符。換言之,有多少 零件,就有多少相應的建造方法。算法
具體建造者(ConcreteBuilder)角色:擔任這個角色的是與應用程序緊密相關的一些類,它們在應用程序調用下建立產品的實例。這個角色要完成的任務包括:1.實現抽象建造者Builder所聲明的接口,給出一步一步地完成建立產品實例的操做。2.在建造過程完成後,提供產品的實例。bash
導演者(Director)角色:擔任這個角色的類調用具體建造者角色以建立產品對象。應當指出的是,導演者角色並無產品類的具體知識,真正擁有產品類的具體知識的是具體建造者角色。ui
產品(Product)角色:產品即是建造中的複雜對象。通常來講,一個系統中會有多於一個的產品類,並且這些產品類並不必定有共同的接口,而徹底能夠是不相關聯的。 this
目錄結構:spa
咱們使用建造者模式, 建立一輛 保時捷(Porsche) 來溜達溜達,大致上一輛車主要有如下屬性(簡單列舉了幾個)code
public class Porsche {
//引擎
private String engine;
//氣缸
private String cylinder;
//車架
private String frame;
// 省略 get/set method
}
複製代碼
抽象Builder類, 列舉咱們在建立一輛車過程當中,須要安裝哪些部件cdn
public abstract class Builder {
public abstract void buildEngine(String engine);
public abstract void buildCylinder(String cylinder);
public abstract void buildFrame(String frame);
public abstract Porsche create();
}
複製代碼
具體實現建立的方法,用於建立車輛htm
public class PorscheBuilder extends Builder {
private Porsche porsche = new Porsche();
public void buildEngine(String engine) {
porsche.setEngine(engine);
}
public void buildCylinder(String cylinder) {
porsche.setCylinder(cylinder);
}
public void buildFrame(String frame) {
porsche.setFrame(frame);
}
public Porsche create() {
return porsche;
}
}
複製代碼
指揮官, 負責建立過程當中的流程編排
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Porsche createPorsche(String engine, String cylinder, String frame) {
builder.buildEngine(engine);
builder.buildCylinder(cylinder);
builder.buildFrame(frame);
return builder.create();
}
}
複製代碼
class create {
public static void main(String[] args) {
Builder builder = new PorscheBuilder();
Director director = new Director(builder);
//組裝車輛
director.createPorsche("engine","cylinder","frame");
}
}
複製代碼
使用場景
參考: