流水做業你們應該都清楚吧!在流水做業中,咱們能夠將一些複雜的東西給構建出來,例如汽車。咱們都知道汽車內部構件比較複雜,由不少部件組成,例如車輪、車門、發動機、方向盤等等,對於咱們用戶來講咱們並不須要知道這個汽車是如何構建出來的,它的各個部件是如何組裝,咱們只須要知道一點:這是一輛完整的汽車。一樣KFC也是這樣的,在KFC中咱們吃套餐也不須要知道這個套餐是怎樣作出來的,咱們只須要在店裏面向服務員點就能夠獲得相應的套餐了。對於這兩個例子咱們經過指定某個對象類型就能夠獲得一個完整的對象,而無須關心其內部的構建。html
在軟件開發中,也會存在一些構造很是複雜的對象,這些對象擁有一系列的成員屬性,這些成員屬性有些是基本數據類型,有些是引用類型,總之就是一句話,這個對象的構建比較複雜。在這裏咱們就將複雜對象當作汽車,成員屬性當作部件,對象的構建當作汽車的組合。對於用戶而言咱們老是但願咱們在使用對象時足夠簡單,若是一個複雜的對象直接丟給用戶,用戶會是痛苦不堪的(給你一堆部件,你來組裝成一輛汽車看看),除了這個構建的過程外,可能用戶會忘記某些成員屬性。因此咱們就但願可以像使用汽車同樣使用複雜的對象:直接告訴你我須要的對象名或者對象類型,你返回一個完成的對象實例給我。建造者返回給客戶一個完整的的產品對象,而客戶端無須關心該對象所包含的額屬性和組建方式,這就是建造者模式的設計動機。java
1、模式定義
建造者模式將一個複雜對象的構建與表示分離,使得一樣的構建過程能夠建立不一樣的表示。post
建造者模式構建複雜對象就像造汽車同樣,是一個一個組件一個一個步驟建立出來的,它容許用戶經過制定的對象類型和內容來建立他們,可是用戶並不須要知道這個複雜對象是如何構建的,它只須要明白經過這樣作我能夠獲得一個完整的複雜對象實例。測試
2、模式結構
建造者模式的UML結構圖:ui
建造者模式主要包含四個角色:this
Builder:抽象建造者。它聲明爲建立一個Product對象的各個部件指定的抽象接口。
ConcreteBuilder:具體建造者。實現抽象接口,構建和裝配各個部件。
Director:指揮者。構建一個使用Builder接口的對象。它主要是用於建立一個複雜的對象,它主要有兩個做用,一是:隔離了客戶與對象的生產過程,二是:負責控制產品對象的生產過程。
Product:產品角色。一個具體的產品對象。spa
3、模式實現
KFC裏面通常都有好幾種可供客戶選擇的套餐,它能夠根據客戶所點的套餐,而後在後面作這些套餐,返回給客戶的事一個完整的、美好的套餐。下面咱們將會模擬這個過程,咱們約定套餐主要包含漢堡、薯條、可樂、雞腿等等組成部分,使用不一樣的組成部分就能夠構建出不一樣的套餐。設計
public class Meal { private String food; private String drink; public String getFood() { return food; } public void setFood(String food) { this.food = food; } public String getDrink() { return drink; } public void setDrink(String drink) { this.drink = drink; } }
而後是套餐構造器:MealBuilder.javahtm
public abstract class MealBuilder { Meal meal = new Meal(); public abstract void buildFood(); public abstract void buildDrink(); public Meal getMeal(){ return meal; } }
而後是套餐A、套餐B。這個兩個套餐都是實現抽象套餐類。
public class MealA extends MealBuilder{ public void buildDrink() { meal.setDrink("一杯可樂"); } public void buildFood() { meal.setFood("一盒薯條"); } }
public class MealB extends MealBuilder{ public void buildDrink() { meal.setDrink("一杯檸檬果汁"); } public void buildFood() { meal.setFood("三個雞翅"); } }
public class KFCWaiter { private MealBuilder mealBuilder; public void setMealBuilder(MealBuilder mealBuilder) { this.mealBuilder = mealBuilder; } public Meal construct(){ //準備食物 mealBuilder.buildFood(); //準備飲料 mealBuilder.buildDrink(); //準備完畢,返回一個完整的套餐給客戶 return mealBuilder.getMeal(); } }
測試類
public class Client { public static void main(String[] args) { //服務員 KFCWaiter waiter = new KFCWaiter(); //套餐A MealA a = new MealA(); //服務員準備套餐A waiter.setMealBuilder(a); //得到套餐 Meal mealA = waiter.construct(); System.out.print("套餐A的組成部分:"); System.out.println(mealA.getFood()+"---"+mealA.getDrink()); } }
運行結果:
套餐A的組成部分:一盒薯條---一杯可樂
4、模式優缺點
優勢
一、將複雜產品的建立步驟分解在不一樣的方法中,使得建立過程更加清晰,使得咱們可以更加精確的控制複雜對象的產生過程。
二、將產品的建立過程與產品自己分離開來,可使用相同的建立過程來獲得不一樣的產品。也就說細節依賴抽象。
三、每個具體建造者都相對獨立,而與其餘的具體建造者無關,所以能夠很方便地替換具體建造者或增長新的具體建造者,用戶使用不一樣的具體建造者便可獲得不一樣的產品對象。
缺點
一、建造者模式所建立的產品通常具備較多的共同點,其組成部分類似,若是產品之間的差別性很大,則不適合使用建造者模式,所以其使用範圍受到必定的限制。
二、若是產品的內部變化複雜,可能會致使須要定義不少具體建造者類來實現這種變化,致使系統變得很龐大。
5、模式適用場景
一、須要生成的產品對象有複雜的內部結構,這些產品對象一般包含多個成員屬性。
二、隔離複雜對象的建立和使用,並使得相同的建立過程能夠建立不一樣的產品。
六。模式總結
一、建造者模式是將一個複雜對象的建立過程給封裝起來,客戶只須要知道能夠利用對象名或者類型就可以獲得一個完整的對象實例,而不須要關心對象的具體建立過程。
二、建造者模式將對象的建立過程與對象自己隔離開了,使得細節依賴於抽象,符合依賴倒置原則。可使用相同的建立過程來建立不一樣的產品對象。
轉載原文連接:https://www.cnblogs.com/chenssy/p/3307787.html