對象的初始化很複雜,并不是指構造方法複雜, 是指對象達到可以使用的狀态,中間需要執行很複雜的邏輯。比如: 要連接配接資料庫,要打開檔案句柄,要加載配置檔案, 要請求rpc接口等。
如果把這些邏輯都一股腦的寫在構造方法, 或者Init方法中, 邏輯就很多很雜, 建造者模式就派上用場了。
優缺點
優點:
- 分離複雜的建立邏輯
- 便于精細控制建立過程
- 建立過程中的變化也易于擴充, 并且對于調用這可以屏蔽這部分的變化
缺點:
- 如果有很多複雜類, 會導緻過多的建造者類
Builder
建造者模式一般需要一個 Builder 。 而建立對象的複雜參數和邏輯都在這裡類中進行, 這個Builder 類的build方法一般就是具體的建立方法, 在build方法中可以校驗檢測下是否準備操作都已經完成了。
日常接觸到的
jdk11中的HttpClient相關的類都是使用建造者模式。
HttpClient build = HttpClient.newBuilder().proxy(A).sslContext(B).build()
HttpRequest request = HttpRequest.newBuilder().uri("www.baidu.com").GET().build()
與工廠模式的差異
- 工廠模式是用來建立不同的對象的, 是為了解耦不同對象的不同建立邏輯的
- 建造者方法隻是用來分離對象的複雜建立邏輯, 解耦對象的建立和調用的邏輯。
思考
建造者模式也是一個簡單的易于掌握的模式, 對于複雜的類的建立都可以考慮使用, 但是我平時對于複雜的對象的建立一般是定義一個init方法, 把所有的邏輯都放入init中, 這種方式還是不太好的。