日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

設(shè)計(jì)模式-建造者模式詳解

 路人甲Java 2020-06-27

一、建造者模式的概念

  建造者模式屬于創(chuàng)建型設(shè)計(jì)模式。

  指的是將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

  建造者模式主要解決在軟件系統(tǒng)中,有時(shí)候面臨著"一個(gè)復(fù)雜對象"的創(chuàng)建工作,其通常由各個(gè)部分的子對象用一定的算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對穩(wěn)定。

  建造者模式主要涉及幾個(gè)角色:

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

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

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

  4、獲取建造者建造的產(chǎn)品給客戶

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

二、建造者模式的實(shí)現(xiàn)

  1、先來一個(gè)產(chǎn)品類(電腦)

namespace BuilderPattern
{
    using System;
    using System.Collections.Generic;

    /// <summary>
    ///     電腦類
    /// </summary>
    public class Computer
    {
        /// <summary>
        ///  電腦組件集合
        /// </summary>
        private readonly IList<string> parts = new List<string>();

        /// <summary>
        /// 把單個(gè)組件添加到電腦組件集合中
        /// </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、再來一個(gè)抽象Builder、兩個(gè)具體的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>
    ///     具體建造者,具體的某個(gè)人為具體創(chuàng)建者,例如:裝機(jī)小王
    /// </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>
    ///     具體建造者,具體的某個(gè)人為具體創(chuàng)建者,例如:裝機(jī)小李啊
    /// </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)
        {
            // 客戶找到電腦城老板說要買電腦,這里要裝兩臺(tái)電腦
            // 創(chuàng)建指揮者和構(gòu)造者
            var director = new Director();
            AbstractBuilder b1 = new ConcreteBuilder1();
            AbstractBuilder b2 = new ConcreteBuilder2();

            Console.WriteLine("開始組裝第一臺(tái)電腦");
            director.Construct(b1);
            Console.WriteLine("獲取第一臺(tái)電腦");
            var computer1 = b1.GetComputer();
            computer1.Show();

            Console.WriteLine("開始組裝第二臺(tái)電腦");
            director.Construct(b2);
            Console.WriteLine("獲取第二臺(tái)電腦");
            var computer2 = b2.GetComputer();
            computer2.Show();

            Console.Read();
        }
    }
}

結(jié)果如下:

三、總結(jié)

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

  BOSS可以隨時(shí)修改電腦的組裝過程,不影響交付給客戶的產(chǎn)品;也可以隨時(shí)換掉組裝電腦的人(ConcreteBuilder1和ConcreBuilder2),不再依賴具體的人。也就是不依賴細(xì)節(jié),都依賴于抽象,使整個(gè)電腦組裝過程更穩(wěn)定。

  建造者模式適用于所創(chuàng)建的產(chǎn)品具有較多的共同點(diǎn),其組成部分相似;如果產(chǎn)品之間的差異性很大,則不適合使用建造者模式,如造飛機(jī)和裝電腦。

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

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多