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

建造者模式角色:
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)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java設(shè)計(jì)模式之建造者模式學(xué)習(xí)
- php設(shè)計(jì)模式 Builder(建造者模式)
- C++設(shè)計(jì)模式之建造者模式
- JavaScript設(shè)計(jì)模式之建造者模式介紹
- Java運(yùn)用設(shè)計(jì)模式中的建造者模式構(gòu)建項(xiàng)目的實(shí)例解析
- JS建造者模式基本用法實(shí)例分析
- 深入理解JavaScript系列(27):設(shè)計(jì)模式之建造者模式詳解
- Java設(shè)計(jì)模式之建造者模式(Builder模式)介紹
- iOS App設(shè)計(jì)模式開發(fā)中對(duì)建造者模式的運(yùn)用實(shí)例
- 深入解析Python設(shè)計(jì)模式編程中建造者模式的使用
相關(guān)文章
asp.net 數(shù)據(jù)訪問層 存儲(chǔ)過程分頁(yè)語句
在asp.net 網(wǎng)頁(yè)中如果在業(yè)務(wù)邏輯層分頁(yè)在使用PagedDataSource對(duì)象,但如果數(shù)據(jù)記錄過多,使用它會(huì)嚴(yán)重的損害應(yīng)用程序的性能.2009-12-12
C#,winform,ShowDialog,子窗體向父窗體傳值
窗體的show方法,沒有給調(diào)用代碼任何通知,如果需要通知,使用showdialog是一種好的選擇。 在調(diào)用show方法后,show方法后面的代碼會(huì)立即執(zhí)行,2008-08-08
VS2017添加EF的MVC控制器報(bào)錯(cuò)的解決方法
這篇文章主要為大家詳細(xì)介紹了VS2017添加EF的MVC控制器報(bào)錯(cuò)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
記一次EFCore類型轉(zhuǎn)換錯(cuò)誤及解決方案
這篇文章主要介紹了記一次EFCore類型轉(zhuǎn)換錯(cuò)誤及解決方案,幫助大家更好的理解和學(xué)習(xí)使用asp.net core,感興趣的朋友可以了解下2021-03-03
淺談.NET中加密和解密的實(shí)現(xiàn)方法分享
這篇文章介紹了.NET中加密和解密的實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-11-11
詳解Spring Boot 中使用 Java API 調(diào)用 lucene
這篇文章主要介紹了詳解Spring Boot 中使用 Java API 調(diào)用 lucene,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
asp.net+xml+flash實(shí)現(xiàn)的圖片展示效果示例
這篇文章主要介紹了asp.net+xml+flash實(shí)現(xiàn)的圖片展示效果的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了圖片展示效果的相關(guān)操作步驟與flash與xml調(diào)用的相關(guān)技巧,需要的朋友可以參考下2016-08-08

