設計模式-建造者模式詳解


一、建造者模式的概念

  建造者模式屬於創建型設計模式。

  指的是將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。

  建造者模式主要解決在軟件系統中,有時候面臨着"一個復雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個復雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定。

  建造者模式主要涉及幾個角色:

  1、指揮者(Director),負責和客戶(Client)對話

  2、之后指揮者將客戶的產品需求划分為比較穩定的建造過程(AbstractBuilder)

  3、指揮者指揮具體的建造者(ConcreteBuilder)干活

  4、獲取建造者建造的產品給客戶

  比如組裝電腦這個場景,CPU、主板、硬盤和內存等配件是相對穩定的,組裝過程也是相當穩定的,先裝CPU、內存、硬盤和電源等等(AbstractBuilder),但是配件搭配的方式是多變的(Builder可以多個),如組裝家用電腦、游戲電腦。

二、建造者模式的實現

  1、先來一個產品類(電腦)

namespace BuilderPattern { using System; using System.Collections.Generic; /// <summary>
    /// 電腦類 /// </summary>
    public class Computer { /// <summary>
        /// 電腦組件集合 /// </summary>
        private readonly IList<string> parts = new List<string>(); /// <summary>
        /// 把單個組件添加到電腦組件集合中 /// </summary>
        /// <param name="part">組件</param>
        public void Add(string part) { this.parts.Add(part); } public void Show() { Console.WriteLine("電腦組件清單:"); foreach (var part in this.parts) { Console.WriteLine($"組件:{part}"); } Console.WriteLine("****************"); } } }

  2、再來一個抽象Builder、兩個具體的Builder

namespace BuilderPattern { /// <summary>
    /// 抽象建造者 /// </summary>
    public abstract class AbstractBuilder { /// <summary>
        /// 裝CPU /// </summary>
        public abstract void BuildPartCPU(); /// <summary>
        /// 裝主板 /// </summary>
        public abstract void BuildPartMainBoard(); /// <summary>
        /// 獲得組裝好的電腦 /// </summary>
        /// <returns>電腦</returns>
        public abstract Computer GetComputer(); } }
namespace BuilderPattern { /// <summary>
    /// 具體建造者,具體的某個人為具體創建者,例如:裝機小王 /// </summary>
    public class ConcreteBuilder1 : AbstractBuilder { private readonly Computer computer = new Computer(); public override void BuildPartCPU() { this.computer.Add("CPU1"); } public override void BuildPartMainBoard() { this.computer.Add("Main board1"); } public override Computer GetComputer() { return this.computer; } } }
namespace BuilderPattern { /// <summary>
    /// 具體建造者,具體的某個人為具體創建者,例如:裝機小李啊 /// </summary>
    public class ConcreteBuilder2 : AbstractBuilder { private readonly Computer computer = new Computer(); public override void BuildPartCPU() { this.computer.Add("CPU2"); } public override void BuildPartMainBoard() { this.computer.Add("Main board2"); } public override Computer GetComputer() { return this.computer; } } }

  3、指揮者登場(BOSS)

namespace BuilderPattern { /// <summary>
    /// 指揮者 /// </summary>
    public class Director { /// <summary>
        /// 組裝電腦 /// </summary>
        /// <param name="abstractBuilder">建造者</param>
        public void Construct(AbstractBuilder abstractBuilder) { abstractBuilder.BuildPartCPU(); abstractBuilder.BuildPartMainBoard(); } } }

  3、使用

namespace BuilderPattern { using System; class Program { static void Main(string[] args) { // 客戶找到電腦城老板說要買電腦,這里要裝兩台電腦 // 創建指揮者和構造者
            var director = new Director(); AbstractBuilder b1 = new ConcreteBuilder1(); AbstractBuilder b2 = new ConcreteBuilder2(); Console.WriteLine("開始組裝第一台電腦"); director.Construct(b1); Console.WriteLine("獲取第一台電腦"); var computer1 = b1.GetComputer(); computer1.Show(); Console.WriteLine("開始組裝第二台電腦"); director.Construct(b2); Console.WriteLine("獲取第二台電腦"); var computer2 = b2.GetComputer(); computer2.Show(); Console.Read(); } } }

結果如下:

三、總結

  以上組裝電腦的過程,把電腦零件和電腦組裝分離了,電腦組裝和電腦組裝過程分離了,也就是我們常說的解耦

  BOSS可以隨時修改電腦的組裝過程,不影響交付給客戶的產品;也可以隨時換掉組裝電腦的人(ConcreteBuilder1和ConcreBuilder2),不再依賴具體的人。也就是不依賴細節,都依賴於抽象,使整個電腦組裝過程更穩定。

  建造者模式適用於所創建的產品具有較多的共同點,其組成部分相似;如果產品之間的差異性很大,則不適合使用建造者模式,如造飛機和裝電腦。

  代碼下載:https://github.com/hzhhhbb/BuilderPattern


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM