目錄
1、建造者模式
2、建造者模式結構
3、實現
4、工廠模式對比
5、適用場景差異
前言
????????建造者模式是一種創建型設計模式。用于封裝復雜對象的構建過程,通過步驟構建產品類。它包括產品類、抽象建造者、具體建造者和指揮者角色。
????????優點在于靈活性、解耦和易擴展,缺點是增加工作量和效率較低。適用場景如構建套餐、字符串動態構建、StreamAPI操作等。
1、建造者模式
(Builder Pattern)建造者模式定義:封裝一個復雜對象構造過程,并允許按步驟構造。
? ? ? ? 將一個復雜對象的構建(如何分步組裝)和其表示(最后生成的產品)分離。使同樣的構建過程可以創建不同表現(參數組合)的對象。
- 針對復雜對象,構建流程有“步驟”,可以按需改變每一步內容或順序
- 最終可以生成不同個性化的產物(同樣流程,不同參數或細節)
2、建造者模式結構
如下所示:
- Product(產品類):最終要建造的復雜對象。
- Builder(抽象建造者):定義構建產品各部分的接口。
- ConcreteBuilder(具體建造者):實現 Builder 接口,每步怎么造。
- Director(指揮者):決定調用哪些步驟,以及什么順序,控制“組裝流程”。
3、實現
假設建造一個定制漢堡(面包、肉、蔬菜、醬料等均可變),可以有不同套餐。
1. 產品類
class Burger {private String bread;private String meat;private String vegetable;private String sauce;// setter/getter略@Overridepublic String toString() {return "Burger{" +"bread='" + bread + '\'' +", meat='" + meat + '\'' +", vegetable='" + vegetable + '\'' +", sauce='" + sauce + '\'' +'}';}
}
2. 抽象建造者
interface BurgerBuilder {BurgerBuilder chooseBread(String bread);BurgerBuilder chooseMeat(String meat);BurgerBuilder chooseVegetable(String vegetable);BurgerBuilder chooseSauce(String sauce);Burger build();
}
3. 具體建造者
class DefaultBurgerBuilder implements BurgerBuilder {private Burger burger = new Burger();@Overridepublic BurgerBuilder chooseBread(String bread) {burger.setBread(bread);return this;}@Overridepublic BurgerBuilder chooseMeat(String meat) {burger.setMeat(meat);return this;}@Overridepublic BurgerBuilder chooseVegetable(String vegetable) {burger.setVegetable(vegetable);return this;}@Overridepublic BurgerBuilder chooseSauce(String sauce) {burger.setSauce(sauce);return this;}@Overridepublic Burger build() {return burger;}
}
4. 指揮者 Director(可選)
如果產品組合很復雜,可以有個指揮者預設“套餐”:
class BurgerDirector {public Burger createCheeseBeefBurger(BurgerBuilder builder) {return builder.chooseBread("芝麻面包").chooseMeat("牛肉").chooseVegetable("生菜").chooseSauce("芝士醬").build();}// 也可有 createSpicyChickenBurger() ...
}
5. 客戶端使用
public class TestBuilder {public static void main(String[] args) {BurgerBuilder builder = new DefaultBurgerBuilder();// 自定義裝配Burger burger = builder.chooseBread("全麥").chooseMeat("雞肉").chooseVegetable("番茄").chooseSauce("千島醬").build();System.out.println(burger);// 使用預定義指揮者裝配套餐BurgerDirector director = new BurgerDirector();Burger cheeseBurger = director.createCheeseBeefBurger(new DefaultBurgerBuilder());System.out.println(cheeseBurger);}
}
結果輸出:
Burger{bread='全麥', meat='雞肉', vegetable='番茄', sauce='千島醬'}
Burger{bread='芝麻面包', meat='牛肉', vegetable='生菜', sauce='芝士醬'}
4、工廠模式對比
特點:
- 創建對象時,一次性指定參數,直接new或工廠create返回對象
- 不能靈活分步驟定制產物,組合變化很局限
- 適合產品結構簡單、參數少、變化小的“快速生產”
簡單工廠/工廠方法代碼:
// 簡單工廠
class BurgerFactory {public static Burger createCheeseBurger() {Burger b = new Burger();b.setBread("芝麻面包");b.setMeat("牛肉");b.setVegetable("生菜");b.setSauce("芝士醬");return b;}public static Burger createChickenBurger() { ... }
}// 使用
Burger burger = BurgerFactory.createCheeseBurger();
對比:
- 工廠模式:側重產物種類,比如“要A還是B”,流程和細節廠內規定死了,客戶端改不了。
- 建造者模式:側重“每一步都能自由定制和變化”,組裝細節自己掌握,可以一個build流程裝不同產品,還能鏈式調用、流式風格。
5、適用場景差異
如下所示:
?
1、Lombok的@Builder注解
支持鏈式建造大對象。
2、StringBuilder/StringBuffer
3、MyBatis的SqlSessionFactoryBuilder
4、復雜業務DTO裝配,配置文件裝配器
5、Stream API:
將集合類轉為stream流,通過一系列的中間操作和終止操作來生成最終結果。
總結
1、建造者模式適用于:
復雜對象的*組裝、參數變化多、“按步構建”*的場景,強調流程可擴展、定制化強。
2、工廠模式適用于:
產品類目變化,強調“要什么生產什么”,但組裝流程是固定的、透明的。
參考文章:
1、設計模式第10講——建造者模式(Builder)-CSDN博客文章瀏覽閱讀1.9w次,點贊68次,收藏204次。建造者模式是一種創建型設計模式,用于封裝復雜對象的構建過程,通過步驟構建產品類。它包括產品類、抽象建造者、具體建造者和指揮者角色。優點在于靈活性、解耦和易擴展,缺點是增加工作量和效率較低。適用場景如構建套餐、字符串動態構建、StreamAPI操作等。代碼示例展示了如何用建造者模式構建肯德基套餐。https://blog.csdn.net/weixin_45433817/article/details/131175862?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522a704756060a8db0d2183b3418eedf674%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=a704756060a8db0d2183b3418eedf674&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-131175862-null-null.142^v102^control&utm_term=%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187