設計模式之七:建造模式(Builder Pattern)

來源:互聯網
上載者:User

建造者模式就是將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示。

適用範圍:

  1. 當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
  2. 當構造過程必須允許被構造的對象有不同表示時。

建造者模式裡面有四個角色:

  1. Builder: 給出一個抽象介面,以規範產品對象的各個組成部分的建造。一般而言,此介面獨立於應用程式的商務邏輯。模式中直接建立產品對象的具體建立者角色。具體建立者角色必須實現這個介面的所有方法:一個是建造方法,另一個是結果返還方法。
  2. ConcreteBuilder:擔任這個角色的是與應用程式緊密相關的類,它們在應用程式調用下建立產品執行個體。這個角色主要完成的任務包括:實現Builder角色提供的介面,一步一步完成建立產品執行個體的過程。在建造過程完成後,提供產品的執行個體。
  3. Director:擔任這個角色的類調用具體建造者以建立產品對象。指導者角色並沒沒用產品類的具體知識,真正擁有產品類的具體知識的是具體建造者對象。
  4. Product: 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。

                               

                      

具體實現代碼如下:

public class Client

    {

        public void Test()

        {

            Director d = new Director();

            IBuilder b1 = new ConcreteBuilder1();

            IBuilder b2 = new ConcreteBuilder2();

            d.Construct(b1);

            Product p1 = b1.GetResult();

            p1.ShowResult();

 

            d.Construct(b2);

            Product p2 = b2.GetResult();

            p2.ShowResult();

 

        }

       

    }

    public class Director

    {

        public void Construct(IBuilder builder)

        {

            builder.BuildPartA();

            builder.BuildPartB();

        }

    }

    public interface IBuilder

    {

        void BuildPartA();

        void BuildPartB();

        Product GetResult();

    }

    public class ConcreteBuilder1 : IBuilder

    {

        private Product product;

        public ConcreteBuilder1()

        {

            this.product =new Product();

        }

        public void BuildPartA()

        {

            product.Add("PartA");

        }

        public void BuildPartB()

        {

            product.Add("PartB");

        }

        public Product GetResult()

        {

            return product;

        }

    }

    public class ConcreteBuilder2 : IBuilder

    {

        private Product product;

        public ConcreteBuilder2()

        {

            this.product = new Product();

        }

        public void BuildPartA()

        {

            product.Add("PartX");

        }

        public void BuildPartB()

        {

            product.Add("PartY");

        }

        public Product GetResult()

        {

            return product;

        }

    }

    public class Product

    {

        List<string> lst = new List<string>();

        public void Add(string part)

        {

            lst.Add(part);

        }

        public void ShowResult()

        {

            foreach (string part in lst)

            {

                Console.WriteLine(part);

            }

        }

    }

 

實現要點:

1.  建造者模式主要用於“分步驟構建一個複雜的對象”,在這其中“分步驟”是一個穩定的演算法,而複雜物件的各個部分則經常變化。

2.  產品不需要抽象類別,特別是由於建立對象的演算法複雜而導致使用此模式的情況下或此模式應用於產品的產生過程,其最終結果可能差異很大,不大可能提煉出一個抽象產品類。

3.  建立者中的建立子組件的介面方法不是抽象方法而是空方法,不進行任何操作,具體的建立者只需要覆蓋需要的方法就可以。

4.  抽象原廠模式解決“系列對象”的需求變化,而Builder模式解決“對象部分”的需求變化,建造者模式常和組合模式(Compsite Pattern)結合使用。

效果

  1. 建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使用戶端不必知道產品內部組成的細節。
  2. 每一個Builder都相對獨立,而與其它的Builder無關。
  3. 可使對構造過程更加精細控制。
  4. 將構建代碼和表示代碼分開。
  5. 建造模式的缺點在於難於應付“分步驟構建演算法”的需求變動。

 

適用性:

以下情況應當使用建造者模式:

  1. 需要生產的產品對象有複雜的內部結構
  2. 需要生產的產品對象的屬性相互依賴,建造者模式可以強迫產生順序
  3. 在對象建立過程中會使用到系統中的一些其它對象,這些對象在產品對象的建立過程中不容易得到。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.