定義:
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 講解:
一個對象(產品),可能有幾部分組成。比如一輛汽車,主要由車身、發動機、輪胎、傳動系統等組成。這些組件或系統就是對象的表示。而建造者模式將汽車這個複雜物件的構建過程與它的表示分離。也就是說客戶只需要告訴建造者模式我想要什麼樣的汽車(小轎車或大卡車)就可以了。至於汽車是如何生產出來了,客戶並不關心。同樣的構建過程,構建出的汽車卻不相同(小轎車或大卡車)。 類圖:
角色: 產品類(Product):具體的產品,一般情況下是一個建立過程比較複雜的產品。
抽象建造者(Builder):抽象類別,定義用來建立產品的抽象方法。
建造者(ConcreteBuilder):實作類別,實現抽象建造者類,並實現其抽象方法。
導演類(Director):負責調用具體的建造者類,來完成產品的建立工作。
代碼:
//產品類Productclass Car {private String body;//車身private String engine;//發動機private String tire;//輪胎private String driveSys;//傳動系統//省略get set方法}//抽象建造者Builderabstract class Builder {protected Car = new Car(); public abstract void buildBody(String body);//建造車身public abstract void buildEngine(String engine);//建造發動機public abstract void buildTire(String tire);//建造輪胎public abstract void builcDriveSys(String driveSys);//建造傳動系統 //獲得汽車public Car getCar(){return car;}}//小轎車建造者ConcreteBuilderclass CarBuilder extends Builder {public void buildBody() {car.setBody("小轎車車身");}public void buildEngine() {car.setEngine("小轎車發動機");}public void buildTire() {car.setTire("小轎車輪胎");}public void builcDriveSys() {car.setDriveSys("小轎車傳動系統");}}//大卡車建造者ConcreteBuilderclass TruckBuilder extends Builder {public void buildBody() {car.setBody("大卡車車身");}public void buildEngine() {car.setEngine("大卡車發動機");}public void buildTire() {car.setTire("大卡車輪胎");}public void builcDriveSys() {car.setDriveSys("大卡車傳動系統");}}//導演類public class Director {private Builder builder;public void setBuilder(Builder builder) {this.builder = builder;}public Car construct() {builder.buildBody();builder.buildEngine();builder.buildTire();builder.builcDriveSys();return builder.getCar();}}//用戶端public class Client {public static void main(String[] args) {Director director = new Director();//導演Builder carBuilder = CarBuilder();director.setBuilder(carBuilder);Car car = director.construct();//小轎車Builder truckBuilder = TruckBuilder();director.setBuilder(truckBuilder);Car truck = director.construct();//大卡車}}好處: 符合依賴倒轉原則,抽象不應該依賴細節,細節應該依賴於抽象。產品的建立依賴於抽象建造者類,而不依賴於具體的建造者類,產品的建立細節在建造者類中實現。 由於具體的建造者類之間相互獨立,這樣就可以定製化的實現不同的產品,而不影響其他已實現的功能。 易於擴充,如果現有的建造者無法滿足需求,只需要增加一個新的建造者實作類別即可,而不會影響其他已實現的功能。
使用情境: 穩定的建立過程,產品對象的建立過程穩定,也就是說抽象建造者類中的抽象方法穩定,不應該出現大的變動。 產品對象的建立過程極其複雜,如果產品對象的建立過於簡單,則不適合使用建造者模式。