1. 程式人生 > >C#設計模式(5)——建造者模式

C#設計模式(5)——建造者模式

1.建造者模式介紹

  在軟體開發中,有時我們要建立一個複雜的物件,這個物件由幾個子部件按一定的步驟組合而成,這時候我們就可以使用建造者模式了。說到建造者我們首先想到的是蓋房子,蓋房子簡單的說有三個步驟:打地基,砌磚,粉刷。我們就以蓋房子為例解釋建造者模式的用法。

  建造者模式有三個角色:建造者,具體的建造者,監工。理清這三個角色的作用我們就可以愉快的使用建造者模式了。

  建造者:一般為抽象類或介面,定義了建造者的功能。如蓋房子例子的建造者有打地基,砌磚和粉刷的功能。

  具體的建造者:實現了建造者的抽象方法(或介面)。不同的具體建造者生產的元件不同,如一個技術好的建造者打地基深,砌磚整齊,粉刷光滑,而技術差的建造者打地基淺,砌磚錯亂,粉刷粗糙。

  監工:制定建造的演算法。建造者可以打地基,砌磚,粉刷,但是不知道先粉刷還是先打地基,監工就是給建造者制定蓋房子步驟的。

程式碼實現如下,

建造者和具體建造者:

   //建造者抽象類,定義了建造者的能力
    public abstract class Builder
    {
        public abstract void Dadiji();//打地基
        public abstract void QiZhuan();//砌磚
        public abstract void FenShua();//粉刷
    }

    /// <summary>
/// 技術好的建造者 /// </summary> public class GoodBuilder : Builder { private StringBuilder house = new StringBuilder(); public override void Dadiji() { house.Append("深地基-->"); //這裡一般是new一個部件,新增到例項中,如 house.Diji=new Diji("深地基")
//為了演示方便 用sringBuilder表示一個複雜的房子,string表示房子的部件 } public override void FenShua() { house.Append("粉刷光滑-->"); } public override void QiZhuan() { house.Append("砌磚整齊-->"); } public string GetHouse() { return house.Append("好質量房子建成了!").ToString(); } } /// <summary> /// 技術差的建造者 /// </summary> public class BadBuilder:Builder { private StringBuilder house = new StringBuilder(); public override void Dadiji() { house.Append("挖淺地基-->"); } public override void FenShua() { house.Append("粉刷粗糙-->"); } public override void QiZhuan() { house.Append("砌磚錯亂-->"); } public string GetHouse() { return house.Append("壞質量房子建成了!").ToString(); } }

監工:

    //監工類,制定蓋房子的步驟
    public class Director
    {
        private Builder builder;
        public Director(Builder builder)
        {
            this.builder = builder;
        }

        //制定蓋房子的流程,
        public void Construct()
        {
            builder.Dadiji();//先打地基
            builder.QiZhuan();//再砌磚
            builder.FenShua();//最後粉刷
        }
    }

客戶端呼叫:

    class Program
    {
        static void Main(string[] args)
        {
            //監工1派遣技術好的建造者蓋房子
            GoodBuilder goodBuilder = new GoodBuilder();
            Director director1 = new Director(goodBuilder);
            director1.Construct();
            string house1 = goodBuilder.GetHouse();
            Console.WriteLine(house1);

            //監工2派遣技術差的建造者蓋房子
            GoodBuilder badBuilder = new GoodBuilder();
            Director director2 = new Director(goodBuilder);
            director2.Construct();
            string house2 = goodBuilder.GetHouse();
            Console.WriteLine(house2);
            Console.ReadKey();
        }
    }

執行結果:

2.小結

上邊例子的類圖

建造者模式的使用場景:

  主要解決在軟體系統中,有時候面臨著"一個複雜物件"的建立工作,其通常由各個部分的子物件用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定,這時適合用建造者模式。

建造者模式的優點:

  1.例項的構建具體到元件層次,方便控制細節;

  2.具體的建造者相互獨立,易於擴充套件。

建造者模式的缺點:

  當元件的組合種類很多時,需要建立很多的具體建造者類。