文章出處

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;
        }
    }
}

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()