介紹
建造者模式(Builder)核心目的是通過使用多個簡單對象一步步構建出一個復雜對象。通過將復雜對象的構造過程拆分為多個簡單的步驟,使得創建對象更加靈活,可讀性和可維護性更強。
使用場景
- 創建一個由多個部分組成的復雜對象,需要遵循特定順序創建對象
- 相同的構建過程可以創建不同的對象表現(類似構造器重載)
- 不影響代碼原來的功能情況下,方便擴展新的組成部分
建造者模式組成部分
- 產品(Product):表示最終要構建的復雜對象
- 建造者(Builder):定義用于構建產品的接口,包含創建產品各個部分的方法
- 具體建造者(Concrete Builder):實現Builder接口,完成產品各個部分的具體構建工作。
- 指揮者(Director):負責調用合適的建造者方法,按照特定順序組裝產品。
代碼案例
在這個示例代碼中,我們有一個Pizza
類,它有4個屬性:面團、醬料、奶酪和配料。我們使用內部類Builder
來構建Pizza
實例。
public class Pizza {private String dough;private String sauce;private String cheese;private List<String> toppings;private Pizza(Builder builder) {this.dough = builder.dough;this.sauce = builder.sauce;this.cheese = builder.cheese;this.toppings = builder.toppings;}public static class Builder {private String dough;private String sauce;private String cheese;private List<String> toppings = new ArrayList<String>();public Builder(String dough, String sauce) {this.dough = dough;this.sauce = sauce;}public Builder cheese(String cheese) {this.cheese = cheese;return this;}public Builder toppings(String... toppings) {this.toppings.addAll(Arrays.asList(toppings));return this;}public Pizza build() {return new Pizza(this);}}@Overridepublic String toString() {return "Pizza{" +"dough='" + dough + '\'' +", sauce='" + sauce + '\'' +", cheese='" + cheese + '\'' +", toppings=" + toppings +'}';}
}
在Builder
類中,我們有一個構造函數,它接受面團和醬料作為參數。我們還有兩個方法cheese
和toppings
,用于設置cheese
和toppings
屬性。
最后,我們有一個build
方法,它返回一個新的Pizza
實例。
使用建造者模式,我們可以這樣構建一個Pizza
實例:
Pizza pizza = new Pizza.Builder("Thin Crust", "Tomato Sauce").cheese("Mozzarella").toppings("Pepperoni", "Mushrooms", "Onions").build();System.out.println(pizza);
控制臺輸出:
Pizza{dough='Thin Crust', sauce='Tomato Sauce', cheese='Mozzarella', toppings=[Pepperoni, Mushrooms, Onions]}
小結
Builder模式是為了創建一個復雜的對象,需要多個步驟完成創建,或者需要多個零件組裝的場景,且創建過程中可以靈活調用不同的步驟或組件。