1. 程式人生 > >建造者模式—通俗易懂解析設計模式

建造者模式—通俗易懂解析設計模式

前言

  在本篇文章中,我們重點介紹建造者模式(Builder Pattern),建造者模式顧名思義,與建造建立相關。事實也是如此建造者模式也是建立型中的一種。在我們平常生活中會有比較複雜的東西的組成過程。比如電腦組成、手機組成、電視組成、等等。就拿電腦組成來說。可以由主機板、Cpu、顯示卡等等組成。但是組成的演算法步驟是一樣的。只是不同的東西組裝起來結果不一樣而已。

建造者模式介紹

一、來由

  在軟體程式設計的過程我們是否也會遇到類似電腦組裝這類的問題呢?當然是會的。組裝一個電腦我們就一次,那豈不是要累死了。類似於這種組裝演算法固定但是各個部分又不穩定經常變化的情況。並且物件組裝較為複雜。為了面對解決這種情況。所以有建造者模式。建造者模式到底是如何解決問題的呢?我們一起看看吧。

二、意圖

  將一個複雜物件的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。    

三、案例圖  

 

四、建造者模式程式碼示例

  在建造者模式中一般包含如下成分:

抽象建造者:抽象建造者為建立複雜產品物件的各個部分指定抽象建立介面

具體建造者:繼承抽象建造者,實現抽象建立介面。指定建立的型別。建立各個具體的部分。

產品角色:複雜產品物件,將各個部分組成產品的介面

指揮者:呼叫各個部分,按固定的演算法建立。不涉及到具體產品類的資訊。僅負責各個部分完整的建立

 

就組裝電腦來說,我們一起看看建造者模式如何實現這一複雜物件的建立設計。

namespace Builder_Pattern
{
    public class BuilderPattern
    {
    }
    #region 產品角色——電腦的組成 ============
    public class Computer
    {
        private string Type = null;
        public Computer(string type)
        {
            this.Type = type;
        }
        private List<string> computer = new List<string>();
        public void Add(string part)
        {
            computer.Add(part);
        }

        public void Show()
        {
            Console.WriteLine("電腦組裝正式開始:");
            foreach (var item in computer)
            {
                Console.WriteLine("配件——" + item + "已裝好");
            }
            Console.WriteLine(Type + "電腦組裝完成了");
        }
    }
    #endregion

    #region 抽象建立者——電腦中的各個部分的抽象介面============

    public abstract class Builder
    {
        /// <summary>
        /// Cpu抽象建立
        /// </summary>
        public abstract void CreateCpu();
        /// <summary>
        /// 主機板抽象建立
        /// </summary>
        public abstract void CreateMotherboard();
        /// <summary>
        /// 顯示卡抽象建立
        /// </summary>
        public abstract void CreateGraphicsCard();
        /// <summary>
        /// 獲取組裝好的電腦
        /// </summary>
        /// <returns></returns>
        public abstract Computer GetComputer();

    }
    #endregion

    #region 具體產品建立者——聯想電腦各個部分建立介面=========
    public class LenovoBuilder : Builder
    {
        Computer lenovo = new Computer("聯想");
        public override void CreateCpu()
        {
            lenovo.Add("聯想CPU");
        }
        public override void CreateMotherboard()
        {
            lenovo.Add("聯想主機板");
        }
        public override void CreateGraphicsCard()
        {
            lenovo.Add("聯想顯示卡");
        }

        public override Computer GetComputer()
        {
            return lenovo;
        }
    }
    #endregion

    #region 具體產品建立者——惠普電腦各個部分建立介面=========
    public class HPBuilder : Builder
    {
        Computer hp = new Computer("惠普");
        public override void CreateCpu()
        {
            hp.Add("惠普CPU");
        }
        public override void CreateMotherboard()
        {
            hp.Add("惠普主機板");
        }
        public override void CreateGraphicsCard()
        {
            hp.Add("惠普顯示卡");
        }

        public override Computer GetComputer()
        {
            return hp;
        }
    }
    #endregion

    #region 指揮者——固定的組裝演算法=================== 
    /// <summary>
    /// 指揮者,其中的Construct是組裝的較為固定演算法
    /// </summary>
    public class Commander
    {
        public void Construct(Builder builder)
        {
            builder.CreateMotherboard();
            builder.CreateCpu();
            builder.CreateGraphicsCard();
        }
    }
    #endregion
}
class Program
    {
        static void Main(string[] args)
        {
            //例項化指揮者
            Commander commander = new Commander();
            //指定具體產品
            Builder builder = new LenovoBuilder();
            //組裝構建產品
            commander.Construct(builder);
            //構建完成展示產品
            Computer computer = builder.GetComputer();
            computer.Show();


            //指定具體產品
            builder = new HPBuilder();
            //組裝構建產品
            commander.Construct(builder);
            //構建完成展示產品
            computer = builder.GetComputer();
            computer.Show();

            Console.ReadLine();
        }
    }

 

使用場景及優缺點

  在建造者模式中,將一個複雜物件的組成與元件的建立分離開。專門的具體建造者來負責元件的建立、然後由指揮者來規定固定組成、最後完成組裝。這一個過程下來。把複雜物件的建立拆分成多個步驟。而其元件也是經常變化的。這樣一來元件的變化僅需修改增加元件的建立即可。不影響其他的擴充套件。這裡由於建造者模式最終建立的產品差異較大,所以並沒有抽象一個產品類。前面一章中講的抽象工廠模式中解決的是”一系列產品物件”的問題。而本章中建造者模式解決的是”產品部分”的問題。抽象工廠模式關心的是整體,注重產品的建立,不關心細節的組成。而建造者模式關心的是細節,注重產品的建立的同時也關係產品組成細節的問題。

一、使用場景

1、當建立一個複雜物件且組成的演算法獨立與其組成部分的時候。

2、 多個部件或配件可以裝配到一個物件但產生的物件不同時。

3、建立一些複雜的物件時,這些物件的內部組成構件間的建造順序是穩定的,但是物件的內部組成構件面臨著複雜的變化。

二、優點

1、使用者客戶端不必關心產品的組成及細節部分。

2、具體建造者與其他類相對獨立,易於擴充套件。不易對其他模組造成影響

3、便於控制細節

三、缺點

1、產品必須有共同點,使用範圍限制

2、如果內部變化較為複雜,會有較多的具體建造者類

總結

  到這裡介紹完了建造者模式,建造者模式與工廠模式相比,建造者模式更像生產的一個複合產品,並且複雜的部件不同所構成的不同,而工廠模式僅是產品。同時建造者模式關注複雜產品細節的建立。但是工廠模式僅關心產品的建立,不在乎其細節的建立。

    做自己生命的主角,而不是別人生命中的看客。

 

  C#設計模式系列目錄

歡迎大家掃描下方二維碼,和我一起踏上設計模式的闖關之路吧!

  

&n