設計模式 Builder模式詳解

2022-09-07 10:03:10 字數 2598 閱讀 3800

builder模式也叫做建造者模式,是設計模式的一種,

就是將複雜物件的建立變得簡單明瞭,使物件與他的表示進行分離,使得同樣的建立過程,可以建立不同的物件.

我們這裡講變種 builder模式(更加簡單,明了),並非真正意義上的builder模式;這種模式的目的用於簡化(不可變)物件的構造(比如 google 的 protobuf 協議,在生成為 j**a **後,都會提供乙個 builder 類去構造相關 message)

解決讓object始終保持valid狀態的問題,解決具有大量引數的建構函式不好用的問題

先看普通構建user類:

public

class

user

public

void

setname

(string name)

public string getpassword()

public

void

setpassword

(string password)

public string tostring()

}

builder模式:

public

class

userb

public string getname()

public string getpassword()

public

static

final

class

userbuilder

public string tostring()

//構建引數是必傳引數

public

static userb.userbuilder create

(string name)

public userb.userbuilder withpassword

(string password)

public userb build()

}}

這種傳統的方式建立大家用的比較多,但是有很多缺點,如我要同時建立多個user,然後對應的user部分屬性不一樣,這樣我要乙個乙個new就很麻煩,但是使用builder模式就簡單一點:

對應的main測試:

public

static

void

main

(string[

] args)

生成的build1,build2是不同的…

通過new生成的物件,在進行set屬性的時候,物件的構造過程是非連續的,也就是說物件可處於乙個構造不完全的狀態,我們很容易寫出將物件傳入各個方法,每個方法去賦值物件的某一部分這樣的**,這其實引入了乙個狀態空間,如果狀態空間是強可控的,那還好(但依然提高了維護成本,你需要牢牢掌握住物件的構造過程,什麼欄位在何處被賦值);如果不可控,那麼就很難保證這個物件是否被正確的構造,可能在某個方法中覆蓋了某欄位,也可能遺漏了某欄位導致 npe。j**a程式設計現在都往不可變物件走,就像string類.

一般都是在user類裡面新建靜態內部userbuilder 類並且提供靜態create方法返回builder,然後就是屬性方法,返回builder,最後就是build方法,返回對應的實體類.

對應的create方法一般是必傳字段,這時候就可以設定為final的;而實體類裡面屬性就都是final的;

這種builder模式幾乎都差不多,如果實體類很多的話,我們會寫很多重複的**,這時候就很麻煩,推薦使用lombok的 @builder 註解,我們就不需要寫任何**了,我們看看通過@builder註解生成的builder類:

使用:

@builder

@data

public

class

userlombok

}

這裡是對應的位元組碼,反編譯的class類:

public

class

userlombok

userlombok

(string name, string password)

public

static userlombok.userlombokbuilder builder()

public string getname()

public string getpassword()

public string tostring()

public

static

class

userlombokbuilder

public userlombok.userlombokbuilder name

(string name)

public userlombok.userlombokbuilder password

(string password)

public userlombok build()

public string tostring()

}}

同樣,如果公司不推薦使用lombok的話,也可以使用idea 的builder外掛程式來生成部分**,具體還得看公司的情況,統一才是王道…

設計模式 Builder模式

bulder模式是一步步建立乙個複雜物件的建立模型,它允許使用者在不知道內部構建細節 的情況下可以更精細地控制物件的構造流程該模式為將構建複雜物件的過程和它的部件 解耦,使得構建過程和部件的表示隔離開來。將乙個負責物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示 3.1 相同的方法,不...

設計模式 Builder模式

網路上有人將它定義為 將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的物件。所以建造者模式適合於乙個具有較多的零件 屬性 的產品 物件 的建立過程。由五個部分構成 1.product concreatebuilder建立該產品的內部表示並定義它的裝配過程。2.builder介面 ...

設計模式 Builder模式

一貫風格,直接上 package created by mingchenchen on 2017 6 14.public class user public void setid string id public string getcountry public void setcountry st...