天天看點

4.建造者模式(Builder Pattern)

建造者模式

在日常生活中有這樣一個場景,我想要一台電腦,但是我又不想要自己買配件組裝,于是找到一個店鋪把找到滿意的電腦下單,商家在收到我的訂單之後,開始安排技術人員組裝,組裝好之後再把電腦寄過來。

對于一台電腦來說,裡面包含CPU、主機闆、顯示卡、記憶體、硬碟、電源、機箱等等配置,可以把電腦當成一個複雜的對象,CPU,主機闆等電腦配件,又有很多種選擇,但是組裝電腦的過程基本是一樣的,這時候就可以用建造者模式實作這一過程。

意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。

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

4.建造者模式(Builder Pattern)

我們來已建立一個水杯舉例子,代碼如下。

using System;

namespace _04_Builder
{
	/// <summary>
    /// 建造者
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //小明要制作一個運動水杯
            Builder b1 = new SportCupBuilder();
            Director director = new Director(b1);
            director.Create();
            
            Cup cup = new Cup();
            cup.Drink();

            Console.ReadKey();
        }
    }
    public class Director
    {
        Builder b = null;
        public Director(Builder builder)
        {
            b = builder;
        }
        public void Create()
        {
            b.BuildString();
            b.BuildCap();
            b.BuildBody();
        }
    }
    //我想定制個水杯
    public abstract class Builder
    {
        public abstract void BuildString();
        public abstract void BuildCap();
        public abstract void BuildBody();
    }
    /// <summary>
    /// 運動水杯
    /// </summary>
    public class SportCupBuilder : Builder
    {
        public override void BuildString()
        {
            Console.WriteLine("經曆一番工作把杯子繩做好了");
        }
        public override void BuildCap()
        {
            Console.WriteLine("杯蓋做好了");
        }
        public override void BuildBody()
        {
            Console.WriteLine("杯子主體做好了");
        }
    }

    //這是我們要制作的水杯
    public class Cup
    {
        private string myString;//繩子
        private string body;  //主體
        private string cap;  //杯蓋

        public string MyString
        {
            get { return myString; }
            set { myString = value; }
        }
        public string Body
        {
            get { return body; }
            set { body = value; }
        }
        public string Cap
        {
            get { return cap; }
            set { cap = value; }
        }
        public void Drink()
        {
            Console.WriteLine("喝水。。。噸噸噸");
        }
    }
}

           

如果說需要在建立另外的一種水杯,同樣是又杯繩,杯蓋,杯體組成的話,就可以仿照

SportCupBuilder

方法在寫一個方法繼承自

Builder

即可。

繼續閱讀