建造者模式

建造者模式使得建造代碼與表示代碼的分離,可使客戶端沒必要知道產品內部組成的細節,從而下降了客戶端與具體產品之間的耦合度,符合單一原則。設計模式

其中: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.產品不須要抽象類,因爲建造模式的建立出來的最終產品可能差別很大,因此不大可能提煉出一個抽象產品類設計

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息