溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是.NET建造者模式

發(fā)布時(shí)間:2021-09-16 14:59:05 來源:億速云 閱讀:99 作者:柒染 欄目:開發(fā)技術(shù)

什么是.NET建造者模式,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

建造者模式的定義:

將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計(jì)模式被稱為建造者模式

建造者模式結(jié)構(gòu)圖:

什么是.NET建造者模式

建造者模式角色:

1 builder:為創(chuàng)建一個(gè)產(chǎn)品對(duì)象的各個(gè)部件指定抽象接口。
2 ConcreteBuilder:實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個(gè)部件,定義并明確它所創(chuàng)建的表示,并提供一個(gè)檢索產(chǎn)品的接口。
3 Director:構(gòu)造一個(gè)使用Builder接口的對(duì)象。
4 Product:表示被構(gòu)造的復(fù)雜對(duì)象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。

下面通過過現(xiàn)實(shí)生活中的建房子的例子,來詮釋建造者模式:

1.抽象出建造者接口,里面有待實(shí)現(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 = "這個(gè)房子共 " + 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 = "這個(gè)房子一共 " + 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)要求哪一個(gè)建造者去建造什么樣子的房間。

 /// <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();//實(shí)例化指導(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)建一個(gè)復(fù)雜的對(duì)象”,在這其中“分步驟”是一個(gè)穩(wěn)定的算法,而復(fù)雜對(duì)象的各個(gè)部分則經(jīng)常變化

產(chǎn)品不需要抽象類,特別是由于創(chuàng)建對(duì)象的算法復(fù)雜而導(dǎo)致使用此模式的情況下或者此模式應(yīng)用于產(chǎn)品的生成過程,其最終結(jié)果可能差異很大,不大可能提煉出一個(gè)抽象產(chǎn)品類。

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

建造者模式的使用使得產(chǎn)品的內(nèi)部表象可以獨(dú)立的變化。使用建造者模式可以使客戶端不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)

每一個(gè)Builder都相對(duì)獨(dú)立,而與其它的Builder無關(guān)。

建造者模式適用于需要生成的產(chǎn)品對(duì)象的屬性相互依賴,建造者模式可以強(qiáng)迫生成順序。需要生成的產(chǎn)品對(duì)象有復(fù)雜的內(nèi)部結(jié)構(gòu)。

看完上述內(nèi)容,你們掌握什么是.NET建造者模式的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI