.NET建造者模式講解

來源:互聯網
上載者:User
建造者模式的定義:

將一個複雜物件的構造與它的表示分離,使同樣的構建過程可以建立不同的表示,這樣的設計模式被稱為建造者模式

建造者模式結構圖:

建造者模式角色:

1 builder:為建立一個產品對象的各個組件指定抽象介面。
2 ConcreteBuilder:實現Builder的介面以構造和裝配該產品的各個組件,定義並明確它所建立的表示,並提供一個檢索產品的介面。
3 Director:構造一個使用Builder介面的對象。
4 Product:表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程,包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。

下面通過過現實生活中的建房子的例子,來詮釋建造者模式:

1.抽象出建造者介面,裡面有待實現的建立房子種類的條件,建立後返回房間的數量,以及這件房子的描述資訊。

/// <summary>/// 抽象建造者/// </summary>public interface IHouse{/// <summary>/// 建立房子種類的條件/// </summary>/// <returns></returns>bool GetBackyard(); /// <summary>/// 建立的房間數/// </summary>/// <returns></returns>long NoOfRooms(); /// <summary>/// 描述/// </summary>/// <returns></returns>string Description();}

2.繼承IHouse介面,具體建造者,這裡建立了一件房間,裡麵包括客廳,廚房,洗手間,臥室,共四件房間這樣一座房子。

public class CRoom{public string RoomName { get; set; }} /// <summary>/// 具體建造者/// </summary>public class CSFH:IHouse{private bool mblnBackyard;private Hashtable Rooms; public CSFH() {CRoom room = new CRoom();room.RoomName = "一樓客廳";Rooms = new Hashtable();Rooms.Add("room1", room); room = new CRoom();room.RoomName = "一樓廚房";Rooms.Add("room2", room); room = new CRoom();room.RoomName = "一樓洗手間";Rooms.Add("room3", room); room = new CRoom();room.RoomName = "一樓臥室";Rooms.Add("room4",room); mblnBackyard = true;} public bool GetBackyard(){return mblnBackyard;} public long NoOfRooms(){return Rooms.Count;} public string Description(){IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator();string strDescription = "這個房子共 " + Rooms.Count + " 間 \n";while (myEnumerator.MoveNext()){strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName;}return strDescription;}}

3.繼承IHouse介面,具體建造者,這裡建立了一件房子,裡面只包括臥室,客廳,廚房共三件房間這樣一座房子。

/// <summary>/// 其他具體建造者/// </summary>public class CApt:IHouse{private bool mblnBackyard;private Hashtable Rooms; public CApt(){Rooms = new Hashtable();CRoom room = new CRoom();room.RoomName = "臥室";Rooms.Add("room1", room); room = new CRoom();room.RoomName = "客廳";Rooms.Add("room2", room); room = new CRoom();room.RoomName = "廚房";Rooms.Add("room3", room); mblnBackyard = false;} public bool GetBackyard(){return mblnBackyard;} public long NoOfRooms(){return Rooms.Count;} public string Description(){IDictionaryEnumerator myEnumerator = Rooms.GetEnumerator();string strDescription = "這個房子一共 " + Rooms.Count + " 間 \n";while (myEnumerator.MoveNext()){ strDescription = strDescription + "\n" + myEnumerator.Key + "\t" + ((CRoom)myEnumerator.Value).RoomName;}return strDescription;}}

4.建立指導者,指導要求哪一個建造者去建造什麼樣子的房間。

/// <summary>/// 指導者/// </summary>public class CDirector{public IHouse BuildHouse(bool blnBackyard){if (blnBackyard){return new CSFH();}else{return new CApt();}}}

5.建立:

static void Main(string[] args){CDirector objDirector = new CDirector();//執行個體化指導者IHouse objHouse;string Input = Console.ReadLine();//輸入條件指導哪位建立者建立房間objHouse = objDirector.BuildHouse(bool.Parse(Input));Console.WriteLine(objHouse.Description());Console.ReadLine();}

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

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

前面的抽象原廠模式解決“系列對象”的需求變化,Builder 模式解決“對象部分”的需求變化。

建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使用戶端不必知道產品內部組成的細節

每一個Builder都相對獨立,而與其它的Builder無關。

建造者模式適用於需要產生的產品對象的屬性相互依賴,建造者模式可以強迫產生順序。需要產生的產品對象有複雜的內部結構。

  • 相關文章

    聯繫我們

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