設計模式(4)之建造者模式
來源:互聯網
上載者:User
建造者模式是最複雜的建立型模式,它用於建立一個包含多個組成部分的複雜物件,可以返回一個完整的產品對象給使用者,建造者模式關注該複雜物件是如何一步一步建立而成的,對於使用者而言,無需知道建立過程和內部組成細節,只需要使用建立好的完整對象即可 複雜物件相當於一輛有待建造的汽車,而對象的屬性相當於汽車的組件,建造產品的過程就相當於組裝組件的過程。由於組裝組件過程很複雜,因此,這些組件的組裝過程被“外部化”到一個稱作建造者的對象裡,建造者返回用戶端的是一個建造完成的完整的產品對象,而使用者無需關心該對象所包含的屬性以及他們的組裝方式,這就是建造者模式的模式動機。 將一個複雜物件的構建與他的表示分離,使得同樣的構造過程可以建立不同的表示,建造者模式是一步一步建立一個複雜的對象,他允許使用者只通過複雜物件的類型和內容就可以建立他們,使用者不需要知道內部建立的具體細節。 案例分析: 描述:kfc建立不同的套餐,套餐是一個複雜物件,它一般包含主食(漢堡、雞肉卷)和飲料(果汁、可樂)等組成部分,不同的套餐有著不同的組成部分,而kfc的服務員可以根據顧客不同的需求,一步一步的裝配這些組成部分,構造一個完整的套餐,然後給顧客。 服務員在這裡就相當於建造模式中的指揮類角色,調用不同的建造者完成組裝過程,然後將產品給使用者 虛擬碼: //產品類meal(套餐),這個就是複雜產品對象,它包括food和dirnk兩個成員屬性,其中food表示主食,drink表示飲料,還有getter setter方法 public class Meal { private string food; private string drink; public void setFood($food) { $this->food = $food; } public void setDrink($dirnk) { $this->dirnk = $dirnk; } public void getFood() { return $this->food; } public void getDrink() { return $this->dirnk; } } //抽獎建造者者類MealBuilder(套餐建造者類),它是一個抽象類別,生命了抽象的組件組裝方法buildFood() 和buildDrink(),MeanBuilder抽象類別中還定義了meal類型的對象meal,提供Factory 方法getMeal返回meal對象 public abstract class MealBuilder { protected $meal = new meal(); public abstract void builderFood(); public abstract void builderDrink(); public meal getMeal() { return $this->meal; } } //具體建造者類SubMealBuilderA,(套餐A的建立者),它是抽象類別MealBuilder的子類,實現了在抽象父類中聲明的builderFood和builderDrink的組件組裝方法,該套餐有一個漢堡和一個肌肉卷組成 public class SubMealBUilderA extends MealBuilder { public void builderFood() { $this->meal->setFood('一個漢堡'); } public void builderDrink() { $this->meal->setDrink('一杯可樂'); } } //具體建造者類SubMealBuilderB,用於建立套餐b,由一個雞肉卷和一杯果汁組成 public class SubMealBUilderB extends MealBuilder { public void builderFood() { $this->meal->setFood('一個雞肉卷'); } public void builderDrink() { $this->meal->setDrink('一杯果汁'); } } //指揮者類KfcWaiter(kfc服務員),在kfc套餐製作工程中,他就是kfc的服務員,在其中定義了一個抽象建造者類型的變數mb,具體建造著類型由用戶端制定,在其construct()方法中調用mb對象的組件組裝方法和返回meal對象的Factory 方法,用於向用戶端返回一個包含主食和飲料的完整套餐。 public class KfcWailter { private MealBuilder $mb; public void setMealBuilder(Mealbuilder $mb) { $this->mb = $mb; } public Meal construct() { $this->mb->builderFood(); $this->mb->builderDrink(); return $this->mb->getMeal(); } } //用戶端調用代碼 MealBuilder $mb = new Config::get('use_builder');//擷取具體的建造者類並執行個體化 kfcWailter $waiter = new KfcWailter();//執行個體化調用者類 $wailter->setMealBuilder($mb);//為指揮者設定具體建造者類 Meal $meal = $wailter->constrcunt();//組裝並且返回 最後總結: 1.建造者模式將一個複雜物件的建立於它的表示分離,這樣同樣的建立過程可以建立不同的而表示。建造者模式是一步一步的建立一個複雜的對象,它允許使用者只通過制定複雜物件的類型和內容就可以建立他們,使用者不需要知道內部的具體構建細節,建造者模式屬於類建立模式。 2.建造者模式包含如下四個角色:抽象建造者是為具體建造者建立一個產品對象的各個組件指定的抽獎介面,是具體建造者的父類;具體建造者繼承抽象建造者,實現父類中各組件的構造和裝配方法,定義它建立的複雜物件;產品抉擇就是那個藥構建的複雜的對象,包含多個組件;指揮者負責安排複雜物件的建造次序,指揮者與抽獎建造者存在關聯關係,指揮著面向抽象編程,通過調用具體建造者方法完成複雜物件的構造。 3.在建造者模式中引入了一個指揮者類,該類的作用主要有兩個:第一是隔離客戶與生產的過程;第二是它複雜產品的建立過程。指揮者只對抽獎編程,用戶端只需要知道要構建的複雜物件的類型,即可通過指揮者類調用建立者的相關方法完成產品的構建。 4.建造者模式的主要優點在於用戶端不需要知道產品內部具體的建立過程,將產品本身與建立過程解耦,是相同的建立過程可以建立不同的產品,每一個具體的建造者都是相互獨立,與其他建造者無關,因此可以在系統中方便的通過替換建造者或者增加具體的建造者來完成需求變更,符合開閉原則,還可以更加精細的控制產品的建立過程;主要缺點是由於建造者模式所建立的產品一般具有較多的共同點,其組成部分形似,因此在使用範圍上受到了一定程度的限制,如果產品內部變化過於複雜,那麼可能導致需要定義很多建造者類來實現這種變化,從而導致系統變得龐大臃腫 不利於維護. 5.建造者模式使用方式包括:需要產生的產品對象有複雜的內部結構,這些產品對象通常包含多個成員屬性;需要產生的產品對象的屬性相互依賴,需要指定其產生順序,對象的建立過程獨立於建立該對象的類;隔離複雜物件的建立和使用,並使得相同的建立過程可以建立出不同的產品對象。