摘要:建造的過程在指揮者這里完成,用戶就不需要知道了客戶端代碼場景二遇到多個構造器參數(shù)時要考慮用構建器。重疊構造器模式可行,但是當有許多參數(shù)的時候,客戶端代碼會很難編寫,并且仍然難以閱讀。
1.場景一
如果我們需要將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示的意圖時,我們可以使用 Builder模式,又叫生成器模式。如果我們用了Builder模式,那么用戶就只需要指定需要建造的類型就可以得到它們,而具體建造的過程和細節(jié)就不需要知道了。
比如現(xiàn)在我們有一個這樣的使用場景,需要在屏幕上畫小人,人要有頭手腳,要畫不同的人,胖的小人,瘦的小人,矮的小人。按照通常的寫法,會有很多的樣板代碼,畫人的頭,畫人腳手,如果一不小心,非常容易缺胳膊少腿。
下面我們演示Builder模式的實現(xiàn):
public class Person { //限于篇幅get和set方法此處省略 Head head; Body body; Arm leftArm; Arm rightArm; Leg leftLeg; Leg rightLeg; public void drawHead(int size){...} public void drawBody(int size){...} public void drawLeftArm(int size){...} public void drawRightArm(int size){...} public void drawLeftLeg(int size){...} public void drawRightLeg(int size){...} } abstract class BuilderPerson { protected Person person = new Person(); public abstract void buildHead(); public abstract void buildBody(); public abstract void buildLeftArm(); public abstract void buildRightArm(); public abstract void buildLeftLeg(); public abstract void buildRightLeg(); } public class BuilderThinPerson extends BuilderPerson{ @Override public void buildHead() { person.drawHead(10); } @Override public void buildBody() { person.drawBody(10); //畫胖小人只需將這邊的數(shù)值修改, // 再生成一個類即可 } @Override public void buildLeftArm() { person.drawLeftArm(5); } @Override public void buildRightArm() { person.drawRightArm(5); } @Override public void buildLeftLeg() { person.drawLeftLeg(7); } @Override public void buildRightLeg() { person.drawRightLeg(7); } } 我們還缺Builder模式中一個非常重要的類,指揮者(Director),用它來控制建造過程,也用來隔離用戶與建造過程的關聯(lián)。 public class PersonDirector{ private BuilderPerson pb; public PersonDirector(BuilderPerson pb){ this.pb = pb; } //建造的過程在指揮者這里完成,用戶就不需要知道了 public void createPerson() { pb.buildHead(); pb.buildBody(); pb.buildLeftArm(); pb.buildRightArm(); pb.buildLeftLeg(); pb.buildRightLeg(); } } 客戶端代碼 BuilderPerson bp = new BuilderThinPerson(); PersonDirector pd = new PersonDirector(bp); pd.createPerson();2.場景二
遇到多個構造器參數(shù)時要考慮用構建器。靜態(tài)工廠和構造器有個共同的局限性:它們都不能很好地擴展到大量的可選參數(shù)。
考慮這樣的一個場景:用一個類表示包裝食品外面顯示的營養(yǎng)成分標簽。這些標簽中有幾個域是必需的:每份的含量、每罐的含量以及每份的卡路里,還有超過20個可選域:總脂肪量、飽和脂肪量、轉化脂肪、膽固醇、鈉等等。
程序員一向習慣采用重疊構造器模式,在這種模式下,你提供第一個只有必要參數(shù)的構造器,第二個構造器有一個可選參數(shù),第三個有兩個可選參數(shù),以此類推,最后一個構造器包含所有可選參數(shù)。重疊構造器模式可行,但是當有許多參數(shù)的時候,客戶端代碼會很難編寫,并且仍然難以閱讀。一長串類型相同的參數(shù)會導致一些微妙的錯誤。如果客戶端不小心顛倒了其中兩個參數(shù)的順序,編譯器也不會出錯,但是程序在運行時會出現(xiàn)錯誤的行為。
下面是Builder模式的代碼:
public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public static class Builder { //required parameters private final int servingSize; private final int servings; //Optional parameters - initialized to default values private int calories; private int fat; private int sodium; private int carbohydrate; public Builder(int servingSize, int servings){ this.servingSize = servingSize; this.servings = servings } public Builder calories(int val){ calories = val; return this; } public Builder fat(int val){ fat = val; return this; } public Builder sodium(int val) { sodium = val; return this; } public Builder carbohydrate(int val){ carbohydrate = val; return this; } public NutritionFacts build() { return new NutritionFacts(this); } } private NutritionFacts(Builder builder){ servingSize = builder.servingSize; servings = builder.servings; calories = builder.calories; fat = builder.fat; sodium = builder.sodium; carbohydrate = builder.carbohydrate; } }
NutritionFacts是不可變的。builder的setter方法返回builder本身,以便可以把調(diào)用鏈接起來。下面就是客戶端代碼:
NutritionFacts juice = new NutritionFacts.Builder(240, 8). calories(100).sodium(35).carbohydrate(27).build();
這樣的客戶端代碼很容易編寫,更重要的是,易于閱讀。
參考:
1.《大話設計模式》
2.《Effective Java 第二版》
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66005.html
摘要:即建造者模式可以強制實行一種分步驟進行的建造過程。指導類負責調(diào)用適當?shù)慕ㄔ煺邅斫M建產(chǎn)品,指導類一般不與產(chǎn)品類發(fā)生依賴關系,與指導類直接交互的是建造者類建造者模式優(yōu)點建造者模式的封裝性很好。 建造者模式 將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創(chuàng)建不同的表示。主要解決在軟件系統(tǒng)中,有時候面臨著一個復雜對象的創(chuàng)建工作,由于需求的變化,這個復雜對象的某些部分經(jīng)常面臨著劇烈的變化...
摘要:參考文章設計模式之建造者模式一什么是建造者模式建造者模式是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。 參考文章:java設計模式之建造者模式 一、什么是建造者模式建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。工廠類模式提供的是創(chuàng)建單個類的模式,而建造者模式則是將各種產(chǎn)品集中起來進行管理,用來創(chuàng)建復合對象,所謂...
摘要:在建造者模式比較龐大時,導演類可以有多個。該種場景只能是一個補償方法,因為一個對象不容易獲得,而在設計階段竟然沒有發(fā)覺,而要通過創(chuàng)建者模式柔化創(chuàng)建過程,本身已經(jīng)違反設計的最初目標。源碼地址參考文獻設計模式之禪 定義 Separate the construction of a complex object from its representation so that the same...
摘要:上期原型模式發(fā)布以后,收到了粉絲的感謝,一條創(chuàng)作的動力更足了。今天我們一塊看一下建造者模式,同樣是創(chuàng)建型設計模式。為我們提供了建造者模式的快速實現(xiàn),要應用到實際編碼中。 ...
摘要:優(yōu)點建造者模式的封裝性很好,對象本身與構建過程解耦。建造者模式很容易進行擴展。適用場景需要生成的對象具有復雜得內(nèi)部結構且內(nèi)部屬性本身相互依賴建造者模式的代碼實現(xiàn)建造者模式主要有個部分產(chǎn)品類建造者類指揮者類客戶。建造者完成相應的部分。 建造者模式 建造者模式(builder pattern)比較簡單,它屬于創(chuàng)建型模式的一種,將一個復雜的對象分解成多個簡單的對象來進行構建,將復雜的構建層與...
閱讀 3665·2021-09-07 09:59
閱讀 724·2019-08-29 15:12
閱讀 808·2019-08-29 11:14
閱讀 1313·2019-08-26 13:27
閱讀 2666·2019-08-26 10:38
閱讀 3137·2019-08-23 18:07
閱讀 1277·2019-08-23 14:40
閱讀 1928·2019-08-23 12:38