建造者模式使得建造代碼與表示代碼的分離,可使客戶端沒必要知道產品內部組成的細節,從而下降了客戶端與具體產品之間的耦合度,符合單一原則。設計模式
其中:Director負責調度Builder的實現類;Builder負責組建Computer,即實現具體生產操做。ide
using System; using System.Collections.Generic; using System.Linq; using System.Text; /// <summary> /// 以組裝電腦爲例子 /// 每臺電腦的組成過程都是一致的,可是使用一樣的構建過程能夠建立不一樣的表示(便可以組裝成不同的電腦,配置不同) /// 組裝電腦的這個場景就能夠應用建造者模式來設計 /// </summary> namespace 設計模式之建造者模式 { /// <summary> /// 客戶類 /// </summary> class Customer { static void Main(string[] args) { // 客戶找到電腦城老闆說要買電腦,這裏要裝兩臺電腦 // 建立指揮者和構造者 Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2(); // 老闆叫員工去組裝第一臺電腦 director.Construct(b1); // 組裝完,組裝人員搬來組裝好的電腦 Computer computer1 = b1.GetComputer(); computer1.Show(); // 老闆叫員工去組裝第二臺電腦 director.Construct(b2); Computer computer2 = b2.GetComputer(); computer2.Show(); Console.Read(); } } /// <summary> /// 小王和小李難道會自願地去組裝嘛,誰不想休息的,這必須有一我的叫他們去組裝纔會去的 /// 這我的固然就是老闆了,也就是建造者模式中的指揮者 /// 指揮建立過程類 /// </summary> public class Director { // 組裝電腦 public void Construct(Builder builder) { builder.BuildPartCPU(); builder.BuildPartMainBoard(); } } /// <summary> /// 電腦類 /// </summary> public class Computer { // 電腦組件集合 private IList<string> parts = new List<string>(); // 把單個組件添加到電腦組件集合中 public void Add(string part) { parts.Add(part); } public void Show() { Console.WriteLine("電腦開始在組裝......."); foreach (string part in parts) { Console.WriteLine("組件"+part+"已裝好"); } Console.WriteLine("電腦組裝好了"); } } /// <summary> /// 抽象建造者,這個場景下爲 "組裝人" ,這裏也能夠定義爲接口 /// </summary> public abstract class Builder { // 裝CPU public abstract void BuildPartCPU(); // 裝主板 public abstract void BuildPartMainBoard(); // 固然還有裝硬盤,電源等組件,這裏省略 // 得到組裝好的電腦 public abstract Computer GetComputer(); } /// <summary> /// 具體建立者,具體的某我的爲具體建立者,例如:裝機小王啊 /// </summary> public class ConcreteBuilder1 : Builder { Computer computer = new Computer(); public override void BuildPartCPU() { computer.Add("CPU1"); } public override void BuildPartMainBoard() { computer.Add("Main board1"); } public override Computer GetComputer() { return computer; } } /// <summary> /// 具體建立者,具體的某我的爲具體建立者,例如:裝機小李啊 /// 又裝另外一臺電腦了 /// </summary> public class ConcreteBuilder2 : Builder { Computer computer = new Computer(); public override void BuildPartCPU() { computer.Add("CPU2"); } public override void BuildPartMainBoard() { computer.Add("Main board2"); } public override Computer GetComputer() { return computer; } } }
1.在建造者模式中,指揮者是直接與客戶端打交道的,指揮者將客戶端建立產品的請求劃分爲對各個部件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工做的,卻不爲客戶所知道ui
2.建造者模式主要用於「分步驟來構建一個複雜的對象」,其中「分步驟」是一個固定的組合過程,而複雜對象的各個部分是常常變化的(也就是說電腦的內部組件是常常變化的,這裏指的的變化如硬盤的大小變了,CPU由單核變雙核等)spa
3.產品不須要抽象類,因爲建造模式的建立出來的最終產品可能差別很大,因此不大可能提煉出一個抽象產品類設計