生成器模式(建造者模式)
把復雜對象的建造過程和表示分離,讓同樣的建造過程可以創建不同的表示。
假設你去快餐店買漢堡,漢堡由面包、肉餅、蔬菜、醬料等部分組成。
建造者模式的角色類比:
- 產品(Product):漢堡
(由多個部分組成的復雜對象) - 抽象建造者(Builder):漢堡建造接口
(定義 “放面包”“放肉餅”“放蔬菜”“放醬料” 等建造步驟) - 具體建造者(ConcreteBuilder):雞肉堡建造者、牛肉堡建造者
(分別實現不同漢堡的建造步驟,比如雞肉堡放雞腿肉,牛肉堡放牛肉餅) - 指揮者(Director):服務員
(告訴建造者 “先放面包→再放肉餅→加蔬菜→加醬料”,控制建造順序)
為什么要用建造者模式?
- 場景對比:
- 不用模式時: 直接 new 一個漢堡對象,要一次性傳所有參數(面包類型、肉餅種類、蔬菜數量…),代碼又長又容易錯。
- 用建造者模式: 像 “組裝樂高” 一樣,一步步造漢堡,每個步驟獨立,最后由指揮者按順序組裝。
核心優勢
- 解耦建造過程和產品表示:比如造 “豪華漢堡” 和 “普通漢堡”,可以復用相同的建造流程,只修改部分步驟。
- 簡化復雜對象創建:避免 “巨量參數構造函數”,代碼更清晰。
- 方便擴展新產品:新增 “素食漢堡” 時,只需新建一個建造者,不修改原有邏輯。
代碼示例
// 1. 產品:漢堡
class Hamburger {private String bread;private String meat;private String veggies;private String sauce;// 省略getter/setter,用Builder模式時很少直接操作這些字段
}// 2. 抽象建造者:定義建造步驟
interface HamburgerBuilder {void buildBread();void buildMeat();void buildVeggies();void buildSauce();Hamburger getHamburger();
}// 3. 具體建造者:雞肉堡建造者
class ChickenBurgerBuilder implements HamburgerBuilder {private Hamburger hamburger = new Hamburger();@Overridepublic void buildBread() { hamburger.setBread("芝麻面包"); }@Overridepublic void buildMeat() { hamburger.setMeat("炸雞腿肉"); }@Overridepublic void buildVeggies() { hamburger.setVeggies("生菜+番茄"); }@Overridepublic void buildSauce() { hamburger.setSauce("番茄醬"); }@Overridepublic Hamburger getHamburger() { return hamburger; }
}// 4. 指揮者:服務員,控制建造順序
class Waiter {private HamburgerBuilder builder;public Waiter(HamburgerBuilder builder) {this.builder = builder;}// 定義“標準漢堡”的建造流程 public Hamburger buildStandardHamburger() {builder.buildBread();builder.buildMeat();builder.buildVeggies();builder.buildSauce();return builder.getHamburger();}
}// 使用示例
public class BuilderDemo {public static void main(String[] args) {// 要雞肉堡?找雞肉堡建造者+服務員 HamburgerBuilder chickenBuilder = new ChickenBurgerBuilder();Waiter waiter = new Waiter(chickenBuilder);Hamburger chickenBurger = waiter.buildStandardHamburger();System.out.println("建造了一個:" + chickenBurger.getBread() + " + " + chickenBurger.getMeat() + " + " + chickenBurger.getVeggies() + " + " + chickenBurger.getSauce());}
}
-
建造者模式和工廠模式的區別
- 工廠模式:“一步到位” 創建簡單對象(如直接 new 一個漢堡)。
- 建造者模式:“分步組裝” 創建復雜對象(如分步驟造漢堡的各個部分)。
-
實際場景舉例
- JDK 中的
StringBuilder
(一步步 append 字符,最后 toString ())。 - SQL 語句構建(分步驟拼表名、條件、排序,避免 SQL 注入)。
- JDK 中的