定義:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。)html
意圖:將一個複雜的構建與其表示相分離,使得一樣的構建過程能夠建立不一樣的表示。算法
主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的建立工做,其一般由各個部分的子對象用必定的算法構成;因爲需求的變化,這個複雜對象的各個部分常常面臨着劇烈的變化,可是將它們組合在一塊兒的算法卻相對穩定。app
● Product產品類ide
一般是實現了模板方法模式,也就是有模板方法和基本方法,例子中的BenzModel和BMWModel就屬於產品類。測試
● Builder抽象建造者ui
規範產品的組建,通常是由子類實現。例子中的CarBuilder就屬於抽象建造者。spa
● ConcreteBuilder具體建造者code
實現抽象類定義的全部方法,而且返回一個組建好的對象。例子中的BenzBuilder和BMWBuilder就屬於具體建造者。htm
● Director導演類對象
負責安排已有模塊的順序,而後告訴Builder開始建造
建造者(Builder)模式的主要角色以下。
什麼時候使用:一些基本部件不會變,而其組合常常變化的時候。
如何解決:將變與不變分離開。
關鍵代碼:建造者:建立和提供實例,導演:管理建造出來的實例的依賴關係。
應用實例: 一、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是常常變化的,生成出所謂的"套餐"。 二、JAVA 中的 StringBuilder。
優勢: 一、建造者獨立,易擴展。 二、便於控制細節風險。
缺點: 一、產品必須有共同點,範圍有限制。 二、如內部變化複雜,會有不少的建造類。
使用場景: 一、須要生成的對象具備複雜的內部結構。 二、須要生成的對象內部屬性自己相互依賴。
● 相同的方法,不一樣的執行順序,產生不一樣的事件結果時,能夠採用建造者模式。
● 多個部件或零件,均可以裝配到一個對象中,可是產生的運行結果又不相同時,則可使用該模式。
● 產品類很是複雜,或者產品類中的調用順序不一樣產生了不一樣的效能,這個時候使用建造者模式很是合適。
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。
步驟 1(產品角色)
步驟 2(抽象建造者(Builder))
步驟 3 ConcerteBuilder類——具體建造者類 ConcerteBuilder2類——具體建造者類(具體建造者(Concrete Builder))
步驟 4(指揮者(Director))
步驟 5
咱們假設一個快餐店的商業案例,其中,一個典型的套餐能夠是一個漢堡(Burger)和一杯冷飲(Cold drink)。漢堡(Burger)能夠是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)能夠是可口可樂(coke)或百事可樂(pepsi),它們是裝在瓶子中。
咱們將建立一個表示食物條目(好比漢堡和冷飲)的 Item 接口和實現 Item 接口的實體類,以及一個表示食物包裝的 Packing 接口和實現 Packing 接口的實體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。
建造者模式與工廠模式的不一樣:
建造者模式最主要的功能是基本方法的調用順序安排,這些基本方法已經實現了,順序不一樣產生的對象也不一樣;
工廠方法則重點是建立,建立零件是它的主要職責,組裝順序則不是它關心的。