您好,登錄后才能下訂單哦!
什么是.NET建造者模式,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
建造者模式的定義:
將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示,這樣的設計模式被稱為建造者模式
建造者模式結構圖:
建造者模式角色:
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無關。
建造者模式適用于需要生成的產品對象的屬性相互依賴,建造者模式可以強迫生成順序。需要生成的產品對象有復雜的內部結構。
看完上述內容,你們掌握什么是.NET建造者模式的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。