火遍全網的Hutool使用Builder模式創建線程池的方法
前言
Builder 設計模式也叫做 構建者模式或者建造者模式,名字隻是一種叫法,當聊起三種名稱的時候知道是怎麼回事就行
Builder 設計模式在作者編碼過程中,屬於比較常用的模式之一。優秀的設計模式總是會受到廣大開發者的青睞,Hutool 也是其中之一
因為上周編寫的業務需要用到線程池,就去 Hutool thread 包下看瞭看,還真有驚喜,學習到瞭一種之前編碼中沒用過的 Builder 模式實現
這裡必須提一句:設計模式重要的是思想,一種設計模式可能不止一種實現方式
Builder 模式文章大綱如下:
- Builder 模式應用場景
- Hutool 線程池如何應用 Builder 模式
- Builder 模式不同的實現方式
- Builder 模式總結
Builder 模式應用場景
Builder 模式作用域:如果類的屬性之間有一定的依賴關系或者約束條件(源自設計模式之美),那麼就可以考慮使用 Builer 設計模式
我們依照線程池來舉例,默認創建的線程池,構造方法最多有七個參數,核心線程數、最大線程數、阻塞隊列、線程存活時間…
日常使用創建線程池時,大傢想一下為什麼要這麼設計?一起來看下源碼註釋中如何解釋此行為
線程池之所以設置如此之多的構造參數,是因為對這些參數會有一定規則的校驗,如果不滿足線程池的規則,將不允許創建線程池,通過拋異常的方式終止程序
終止規則大概有七點,這裡列舉一下:
- 核心線程數不可以小於 0
- 線程存活時間不可以小於 0
- 最大線程數不可以小於等於 0,同時也不可以小於核心線程數
- 阻塞隊列、線程工廠、拒絕策略參數均不可為空
上述七點有兩個作用,其一是為瞭讓核心參數滿足線程池運行流程,其二是為瞭保障運行時的穩定性
小夥伴想一哈線程池創建是不是灰常灰常適合 Builder 模式,構造器函數過多以及屬性之間存在依賴關系和約束條件
Hutool Builder 創建線程池
Hutool 線程池相關使用 Builder 設計模式有兩處,一個是創建線程池,另一個是創建線程工廠,我們重點圍繞線程池說
創建 Hutool 線程池比較簡單且優雅,筆者較喜歡這種鏈式風格,所以抽象公共業務時都會使用此模式,如圖所示
這個時候跟下源碼,先從 ExecutorBuilder#create
入手,小夥伴就明白 Hutool 是如何玩 Builder 模式瞭
public static ExecutorBuilder create() { return new ExecutorBuilder(); }
What? 自己創建自己?這是要搞啥子
小夥伴想一下,如果你想要對一個類中屬性進行約束,前提是不是先應該把屬性搞到手
沒錯,ExecutorBuilder#create
方法返回自己本身,然後通過 set 方法 把數據填充到創建出來的對象上,最後再進行依賴關系整理和條件約束
看一下 ExecutorBuilder#build
方法內部做瞭什麼事情
這裡有個知識點,也是B格之一,大傢看到 build 方法上有 @Override 註解,證明它是實現瞭接口方法
Hutool 定義瞭 Builder 接口,實現此接口即可完成 Builder 模式,泛型 T 代表需要返回的構造對象類型,比如剛才線程池 Builder 泛型就是 ThreadPoolExecutor
在實現 build 方法上調用真正管理依賴和約束的方法 build(ExecutorBuilder builder),將剛才創建好並且已經賦過值的構建對象傳入
最後 build(ExecutorBuilder builder) 返回的就是我們所需要的線程池對象,這一塊大傢可以自己跟下源碼,學會就可以套用自己寫的業務代碼
Hutool Version:5.0.6
源碼包路徑:cn.hutool.core.thread
Builder 模式不同的實現方式
上文說過,設計模式重思想,就像 Builder 模式,強調的是 管理依賴關系或者約束條件
剛才 Hutool Builder 隻是一種實現方式,之前還用過靜態內部類的實現方式
代碼經過精剪,並且為瞭閱讀體驗感,把部分縮進去除瞭。不過筆者測試過粘貼到 IDEA 中編譯是可以的
@Getter public class HttpParameters { private Builder builder; public static Builder newBuilder() { return new Builder(); } private HttpParameters(Builder builder) { this.builder = builder; } @Getter public static class Builder { private String url; private Object parameter; private String httpType; public Builder parameter(Object parameter) { this.parameter = parameter; return this;} public Builder url(String url) { this.url = url; return this; } public Builder httpType(String httpType) { this.httpType = httpType; return this; } public HttpParameters build() { if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允許為空 "); } // ... return new HttpParameters(this); } } }
如果後面要獲取 HttpParameters 參數就需要先獲取 Builder 對象
可能有些小夥伴不習慣這種方式,也可以把 Builder 對象屬性在 Parameters 裡也定義一份,方式都很靈活
結言
本文通過創建線程池為引,講述瞭 Builder 設計模式的場景以及實際用途,並引用 Hutool Builder 模式創建線程池進行講解。相信大傢看完之後對 Builder 模式的場景以及應用有瞭更深入的瞭解,另外我們可以將 Builder 模式引入到自己代碼中,實際操練一下,相信你也會對它 “愛不釋手”
另外,早之前筆者使用線程池都是自己封裝,同時用到瞭 Builder、模版方法 兩種模式,並且重寫瞭部分線程池方法,使用以及排查問題都比較順手。因為篇幅有限這裡就不貼瞭,需要的小夥伴可以添加微信自取
關於 Builder 設計模式本文就講到這裡,後面會陸續輸出策略、工廠、責任鏈等模式;
到此這篇關於火遍全網的Hutool使用Builder模式創建線程池的方法的文章就介紹到這瞭,更多相關Builder模式創建線程池內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java中lombok的@Builder註解的解析與簡單使用詳解
- Java創建型模式之建造者模式詳解
- 使用Lombok @Builder註解導致默認值無效的問題
- 解析Java中的static關鍵字
- Lombok的詳細使用及優缺點總結