目錄
1、核心思想
2、實現方式
2.1 模式結構
2.2 工作流程
2.3?實現案例
2.4 變體:鏈式建造者(常見于多參數對象,無需指揮者)
3、優缺點分析
4、適用場景
1、核心思想
目的:將復雜對象的構建過程與其表示分離,使得同樣的構建過程可以創建不同的表示。
???????????建造者的制造過程不僅要分步完成,還要按照順序進行,所以建造者的各制造步驟與邏輯都應該被抽離出來獨立于數據模型。
2、實現方式
2.1 模式結構
四個核心結構:
- Product(產品)?:復雜的產品類,構建過程相對復雜,需要其他組件組裝而成。
- Builder(抽象建造者)?:建造者接口,定義了構成產品的各個組件的構建標準,通常有多個步驟。
- ConcreteBuilder(具體建造者)?:具體的建造者實現類,可以有多種實現,負責產品的組裝但不包含整體建造邏輯。
- Director(指揮者)?:持有建造者接口引用的指導者類,指導建造者按一定的邏輯進行建造。
2.2 工作流程
客戶端創建具體建造者實例,并傳遞給指揮者。
指揮者按預定步驟調用建造者的方法。
具體建造者逐步構建產品的各個部件。
最終由建造者返回組裝完成的產品。
2.3?實現案例
假設構建一個House對象,步驟包括打地基、建墻、裝屋頂和裝修。不同房屋類型(如木屋、磚房)的建造細節不同,但流程一致。
每一個房屋的結構一致,施工方(具體建造者)不同,會導致最終的房屋產品類型不同。所以如果需要擴展建造的房屋類型,只需要擴展增加具體建造者的實現(比如磚房建造者等),符合開閉原則
// 1、產品類
class House {private String foundation;private String walls;private String roof;// 省略getter/setter
}// 2、抽象建造者
interface HouseBuilder {void buildFoundation();void buildWalls();void buildRoof();House getResult();
}// 3、具體建造者:木屋
class WoodHouseBuilder implements HouseBuilder {private House house = new House();public void buildFoundation() { house.setFoundation("Wood Foundation"); }public void buildWalls() { house.setWalls("Wood Walls"); }public void buildRoof() { house.setRoof("Wood Roof"); }public House getResult() { return house; }
}// 4、指揮者
class ConstructionDirector {public House construct(HouseBuilder builder) {builder.buildFoundation();builder.buildWalls();builder.buildRoof();return builder.getResult();}
}// 5、客戶端使用
public class Client {public static void main(String[] args) {HouseBuilder builder = new WoodHouseBuilder();ConstructionDirector director = new ConstructionDirector();House house = director.construct(builder);}
}
2.4 變體:鏈式建造者(常見于多參數對象,無需指揮者)
// 產品類
class Person {private String name;private int age;// 其他屬性...// 建造者作為靜態內部類public static class Builder {private String name;private int age = 0; // 默認值public Builder(String name) { this.name = name; }public Builder age(int age) { this.age = age; return this; }public Person build() { return new Person(this); }}private Person(Builder builder) {this.name = builder.name;this.age = builder.age;}
}// 客戶端使用
Person person = new Person.Builder("Alice").age(30).build();
3、優缺點分析
優點:
分離構建與表示:客戶端無需了解內部構造細節。
靈活擴展:通過新增建造者支持新產品類型。
精細控制:分步驟構建,便于管理復雜對象的創建過程。
缺點:
代碼冗余:需編寫多個建造者類,增加代碼量。
適用范圍有限:僅當對象構造復雜或存在多種表示時適用。
4、適用場景
-
對象包含多個部件,且構建過程需相同步驟。
-
構造過程需支持不同配置或表示(如生成不同格式文檔)。
-
需要創建的對象具有大量可選參數或復雜依賴。