設計模式 Builder模式

2021-08-29 04:59:29 字數 2029 閱讀 8847

建造者模式(builder pattern)通過將乙個複雜物件的構建過程與它的表現分離,使得構建的過程可以自由擴充套件,降低部件與組裝過程的耦合,是建立型模式。

考慮這樣乙個場景,假如有乙個類(user),裡面有很多屬性,並且你希望這些類的屬性都是不可變的(final),就像下面的**。

public class user
在這個類中,有些引數是必要的,而有些引數是非必要的,就好比在註冊使用者時,使用者的姓和名是必填的,而年齡、手機號和家庭位址等是非必需要。那麼問題就來了,如何建立這個類的物件呢?

一種方案是使用構造方法。第乙個構造方法只包含兩個必需要引數,第二個構造方法中,增加乙個可選引數,第三個構造方法中再增加乙個可選引數,依次類推,直到構造方法中包含了所有引數。

public user(string firstname, string lastname) 

public user(string firstname, string lastname, int age)

public user(string firstname, string lastname, int age, string phone)

public user(string firstname, string lastname, int age, string phone, string address)

弊端:

(1)一旦引數多了,**可讀性就差,並且難以維護。

(2)對呼叫者來說麻煩。

第二種解決方案,就是設定乙個空引數的構造方法,然後為每乙個屬性設定setters和getters。

public class user 

public string getfirstname()

public string getlastname()

public int getage()

public string getphone()

public string getaddress()

}

弊端:

(1)不可變類的所有好處都不復存在。

(2)物件會產生不一致的狀態,當你想要傳入5個引數的時候,你必須將所有的setxx方法呼叫完成之後才行,然而一部分的呼叫者看到這個物件後,以為這個物件已建立完畢,就直接使用了,其實user物件並沒有建立完成。

現在我們使用builder模式

public class user 

public string getfirstname()

public string getlastname()

public int getage()

public string getphone()

public string getaddress()

public static class userbuilder

public userbuilder age(int age)

public userbuilder phone(string phone)

public userbuilder address(string address)

public user build() }}

有現個重要的地方需要強調一下:

(1)user類的構造方法是私有的,也就是說呼叫者不能直接建立user物件。

(2)user類的屬性都是不可變的,所有的屬性都新增了final修飾符,並且在構造方法中設定了值,並且,對外只提供getters方法。

(3)builder模式使用了鏈式呼叫,可讀性更佳。

(4)builder的內部類構造方法中只接收必傳的引數,並且該必傳的引數使用final修飾符。

之前例項中的builder模式,是省略掉了裝飾者模式,這樣結構更加簡單,所以在很多開源框架原始碼中,大多都不是經典gof的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...