.NET建造者模式講解
建造者模式的定義:
將一個復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計模式被稱為建造者模式
建造者模式結(jié)構(gòu)圖:
建造者模式角色:
1 builder:為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口。
2 ConcreteBuilder:實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,并提供一個檢索產(chǎn)品的接口。
3 Director:構(gòu)造一個使用Builder接口的對象。
4 Product:表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
下面通過過現(xiàn)實生活中的建房子的例子,來詮釋建造者模式:
1.抽象出建造者接口,里面有待實現(xiàn)的創(chuàng)建房子種類的條件,創(chuàng)建后返回房間的數(shù)量,以及這件房子的描述信息。
/// <summary> /// 抽象建造者 /// </summary> public interface IHouse { /// <summary> /// 創(chuàng)建房子種類的條件 /// </summary> /// <returns></returns> bool GetBackyard(); /// <summary> /// 創(chuàng)建的房間數(shù) /// </summary> /// <returns></returns> long NoOfRooms(); /// <summary> /// 描述 /// </summary> /// <returns></returns> string Description(); }
2.繼承IHouse接口,具體建造者,這里創(chuàng)建了一件房間,里面包括客廳,廚房,洗手間,臥室,共四件房間這樣一座房子。
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接口,具體建造者,這里創(chuàng)建了一件房子,里面只包括臥室,客廳,廚房共三件房間這樣一座房子。
/// <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.創(chuàng)建指導(dǎo)者,指導(dǎo)要求哪一個建造者去建造什么樣子的房間。
/// <summary> /// 指導(dǎo)者 /// </summary> public class CDirector { public IHouse BuildHouse(bool blnBackyard) { if (blnBackyard) { return new CSFH(); } else { return new CApt(); } } }
5.創(chuàng)建:
static void Main(string[] args) { CDirector objDirector = new CDirector();//實例化指導(dǎo)者 IHouse objHouse; string Input = Console.ReadLine();//輸入條件指導(dǎo)哪位創(chuàng)建者創(chuàng)建房間 objHouse = objDirector.BuildHouse(bool.Parse(Input)); Console.WriteLine(objHouse.Description()); Console.ReadLine(); }
建造者模式主要用于“分步驟構(gòu)建一個復(fù)雜的對象”,在這其中“分步驟”是一個穩(wěn)定的算法,而復(fù)雜對象的各個部分則經(jīng)常變化
產(chǎn)品不需要抽象類,特別是由于創(chuàng)建對象的算法復(fù)雜而導(dǎo)致使用此模式的情況下或者此模式應(yīng)用于產(chǎn)品的生成過程,其最終結(jié)果可能差異很大,不大可能提煉出一個抽象產(chǎn)品類。
前面的抽象工廠模式解決“系列對象”的需求變化,Builder 模式解決“對象部分”的需求變化。
建造者模式的使用使得產(chǎn)品的內(nèi)部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)
每一個Builder都相對獨立,而與其它的Builder無關(guān)。
建造者模式適用于需要生成的產(chǎn)品對象的屬性相互依賴,建造者模式可以強迫生成順序。需要生成的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Net?core中使用System.Drawing對上傳的圖片流進行壓縮(示例代碼)
這篇文章主要介紹了Net?core中使用System.Drawing對上傳的圖片流進行壓縮,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08解決ASP.NET中Type.GetType方法總返回空的問題
今天做練習(xí)的時候用到了Type.GetType方法。。 可是他總返回null。。2008-03-03如何對ASP.NET網(wǎng)站實現(xiàn)靜態(tài)化
對于訪問量比較大的網(wǎng)站,網(wǎng)頁靜態(tài)化是一個比較可靠的解決方案。靜態(tài)化將顯著降低服務(wù)器的壓力,提升服務(wù)器處理能力。下面將介紹兩種不同的實現(xiàn)方法,并進行對比。2015-09-09GridView分頁的實現(xiàn)以及自定義分頁樣式功能實例
本文為大家詳細(xì)介紹下GridView實現(xiàn)分頁并自定義的分頁樣式,具體示例代碼如下,有想學(xué)習(xí)的朋友可以參考下哈,希望對大家有所幫助2013-07-07ASP.NET Core使用EF保存數(shù)據(jù)、級聯(lián)刪除和事務(wù)使用
這篇文章介紹了ASP.NET Core使用EF保存數(shù)據(jù)、級聯(lián)刪除和事務(wù)使用的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04