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

來源:互聯網
上載者:User

標籤:大小   變化   ide   方式   指定   over   rtm   etc   需求變化   

1、建造者模式簡介

1.1>、定義

  建造者模式(Builder)將複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。

1.2>、使用頻率

   中低

1.3>、原型模式應用

  在軟體系統中,有時候面臨一個複雜物件的建立工作,該對象通常由各個部分子物件用一定的演算法構成,或者按一定的步驟組合而成;這些演算法和步驟是穩定的,而構成這個對象的子物件卻經常由於需求的變化而不斷變化。

  生活中的例子,要組裝一台電腦,它的組裝過程基本是不變的,都可以由主板、CPU、記憶體等按照某個穩定方式組合而成。然而主板、CPU、記憶體等零件本身都是可能多變的。將記憶體等這種易變的零件與電腦的其他組件分離,實現解耦合,則可以輕鬆實現電腦不斷升級。

2、建造者模式結構

2.1>、結構圖

2.2>、參與者

  建造者模式參與者:

  ? Builder:為建立一個Product對象的各個組件指定抽象介面;

  ? ConcreteBuilder

    ° 實現Builder的介面以構造和裝配該產品的各個組件

    ° 定義並明確它所建立的表示

    ° 提供一個檢索Product的介面

  ? Director:構造一個使用Builder介面的對象;

  ? Product

    ° 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程

    ° 包含定義組成組件的類,包括將這些組件裝配成最終產品的介面

  在建造者模式中,Director規定了建立一個對象所需要的步驟和次序,Builder則提供了一些列完成這些步驟的方法,ConcreteBuilder給出了這些方法的具體實現,是對象的直接建立者。

using System;using System.Collections.Generic;using System.Linq;using System.Text;/// <summary>/// 以組裝電腦為例子/// 每台電腦的組成過程都是一致的,但是使用同樣的構建過程可以建立不同的表示(即可以組裝成不一樣的電腦,配置不一樣)/// 組裝電腦的這個情境就可以應用建造者模式來設計/// </summary>namespace 設計模式之建造者模式{    /// <summary>    /// 客戶類    /// </summary>    class Customer    {        static void Main(string[] args)        {            // 客戶找到電腦城老闆說要買電腦,這裡要裝兩台電腦            // 建立指揮者和構造者            Director director = new Director();            Builder b1 = new ConcreteBuilder1();            Builder b2 = new ConcreteBuilder2();            // 老闆叫員工去組裝第一台電腦            director.Construct(b1);            // 組裝完,組裝人員搬來組裝好的電腦            Computer computer1 = b1.GetComputer();            computer1.Show();            // 老闆叫員工去組裝第二台電腦            director.Construct(b2);            Computer computer2 = b2.GetComputer();            computer2.Show();            Console.Read();        }    }    /// <summary>    /// 小王和小李難道會自願地去組裝嘛,誰不想休息的,這必須有一個人叫他們去組裝才會去的    /// 這個人當然就是老闆了,也就是建造者模式中的指揮者    /// 指揮建立過程類    /// </summary>    public class Director    {        // 組裝電腦        public void Construct(Builder builder)        {            builder.BuildPartCPU();            builder.BuildPartMainBoard();        }    }    /// <summary>    /// 電腦類    /// </summary>    public class Computer    {        // 電腦組件集合        private IList<string> parts = new List<string>();        // 把單個組件添加到電腦組件集合中        public void Add(string part)        {            parts.Add(part);        }        public void Show()        {            Console.WriteLine("電腦開始在組裝.......");            foreach (string part in parts)            {                Console.WriteLine("組件"+part+"已裝好");            }            Console.WriteLine("電腦組裝好了");        }    }    /// <summary>    /// 抽象建造者,這個情境下為 "組裝人" ,這裡也可以定義為介面    /// </summary>    public abstract class Builder    {        // 裝CPU        public abstract void BuildPartCPU();        // 裝主板        public abstract void BuildPartMainBoard();                // 當然還有裝硬碟,電源等組件,這裡省略        // 獲得組裝好的電腦        public abstract Computer GetComputer();    }    /// <summary>    /// 具體建立者,具體的某個人為具體建立者,例如:裝機小王啊    /// </summary>    public class ConcreteBuilder1 : Builder    {        Computer computer = new Computer();        public override void BuildPartCPU()        {            computer.Add("CPU1");        }        public override void BuildPartMainBoard()        {            computer.Add("Main board1");        }        public override Computer GetComputer()        {            return computer;        }    }    /// <summary>    /// 具體建立者,具體的某個人為具體建立者,例如:裝機小李啊    /// 又裝另一台電腦了    /// </summary>    public class ConcreteBuilder2 : Builder    {        Computer computer = new Computer();        public override void BuildPartCPU()        {            computer.Add("CPU2");        }        public override void BuildPartMainBoard()        {            computer.Add("Main board2");        }        public override Computer GetComputer()        {            return computer;        }    }}

  

3、建造者模式分析

介紹完了建造者模式的具體實現之後,讓我們總結下建造模式的實現要點:

  1. 在建造者模式中,指揮者是直接與用戶端打交道的,指揮者將用戶端建立產品的請求劃分為對各個組件的建造請求,再將這些請求委派到具體建造者角色,具體建造者角色是完成具體產品的構建工作的,卻不為客戶所知道。
  2. 建造者模式主要用於“分步驟來構建一個複雜的對象”,其中“分步驟”是一個固定的組合過程,而複雜物件的各個部分是經常變化的(也就是說電腦的內部組件是經常變化的,這裡指的的變化如硬碟的大小變了,CPU由單核變雙核等)。
  3. 產品不需要抽象類別,由於建造模式的建立出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類。
  4. 在前面文章中介紹的抽象原廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化。
  5. 由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.