C# 設(shè)計模式系列教程-建造者模式
1. 概述
將一個復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表示,這樣的設(shè)計模式被稱為建造者模式。
2. 建造者模式中的角色
2.1 建造者(Builder):為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口。
2.2 具體建造者(ConcreteBuilder):實(shí)現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,并 提供一個檢索產(chǎn)品的接口。
2.3 指揮者(Director):指揮并構(gòu)造一個使用Builder接口的對象。
2.4 產(chǎn)品(Product):表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
3. 實(shí)例:創(chuàng)建一個人,這個人可以有不同的特點(diǎn),可以是胖子,可以是瘦子,可以是高個子,也可以是矮個子。
3.1 以下是這個實(shí)例的類圖,以及對類圖的解讀。

3.2 代碼實(shí)現(xiàn)及解讀:
// 要建造的產(chǎn)品
public class Person
{
public string Head { get; set; }
public string Body { get; set; }
public string Arm { get; set; }
public string Leg { get; set; }
}
// 定義創(chuàng)建者接口,實(shí)現(xiàn)者必須實(shí)現(xiàn)該接口中定義的所有抽象方法,防止實(shí)現(xiàn)者疏忽而遺漏某個部件的創(chuàng)建
public abstract class Builder
{
protected Person Person { get; set; }
public Builder()
{
Person = new Person();
}
// 建造頭
public abstract void BuildHead();
// 建造身體
public abstract void BuildBody();
// 建造胳膊
public abstract void BuildArm();
// 建造腿
public abstract void BuildLeg();
// 返回生成好的對象,這是一個具體方法,每個子類都可以使用它來返回一個已經(jīng)創(chuàng)建成功的對象
public Person GetPerson()
{
return Person;
}
}
// 建造者的具體實(shí)現(xiàn),這里是要建造出一個瘦子
public class ThinPersonBuilder : Builder
{
public ThinPersonBuilder()
{
Person = new Person();
}
public override void BuildHead()
{
Person.Head = "瘦子的腦袋";
}
public override void BuildBody()
{
Person.Body = "瘦子的身體";
}
public override void BuildArm()
{
Person.Arm = "瘦子的胳膊";
}
public override void BuildLeg()
{
Person.Leg = "瘦子的腿";
}
}
// 建造者的具體實(shí)現(xiàn),這里是要建造出一個胖子
public class FatPersonBuilder : Builder
{
public override void BuildHead()
{
Person.Head = "胖子的腦袋";
}
public override void BuildBody()
{
Person.Body = "胖子的身體";
}
public override void BuildArm()
{
Person.Head = "胖子的胳膊";
}
public override void BuildLeg()
{
Person.Head = "胖子的腿";
}
}
// 建造者模式中的指揮者
public class PersonDirector
{
Builder builder;
public PersonDirictor(Builder personBuilder)
{
builder = personBuilder;
}
// 指揮創(chuàng)建一個人的過程,并返回創(chuàng)建成功的產(chǎn)品
public Person BuildPerson()
{
builder.BuildHead();
builder.BuildBody();
builder.BuildArm();
builder.BuildLeg();
return builder.GetPerson();
}
}
4. 模式總結(jié)
4.1 優(yōu)點(diǎn)
4.1.1 用戶只需要指定要建造的類型就可以得到它們,而具體的建造過程和細(xì)節(jié)不需要知道。
4.1.2 建造代碼與表示相分離,如果要改變一個產(chǎn)品的內(nèi)部表示,只要再定義一個新的具體的建造者就可以了。
4.1.3 建造過程由指揮者來控制,建造細(xì)節(jié)由一個抽象類來控制,對于實(shí)現(xiàn)建造細(xì)節(jié)的具體類來說,不會遺漏某一個步驟。
4.2 缺點(diǎn)
以上例子說明,現(xiàn)在我要增加產(chǎn)品的一個細(xì)節(jié),如把創(chuàng)建腳的過程也添加進(jìn)來,看我們需要改哪些類。Buider,FatPersonBuilder,ThinPersonBuilder(甚至更多,如果你實(shí)現(xiàn)了TallPersonBuilder,ShortPersonBuilder等),PersonDirector,我們對修改也就開放了。
4.3 實(shí)用范圍
4.3.1 當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨(dú)立于該對象的組成部分以及它們的裝配方式時。
4.3.2 當(dāng)復(fù)雜對象的部件相對穩(wěn)定,不會發(fā)生變化時
以上就是本文的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#項(xiàng)目中跨文件調(diào)用公共類的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于C#項(xiàng)目中如何跨文件調(diào)用公共類的知識點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。2019-08-08
C#中神器類BlockingCollection的實(shí)現(xiàn)詳解
如果你想玩轉(zhuǎn)C#?里面多線程,工廠模式,生產(chǎn)者/消費(fèi)者,隊(duì)列等高級操作,就可以和我一起探索這個強(qiáng)大的線程安全提供阻塞和限制功能的C#神器類BlockingCollection吧2023-02-02
C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式
這篇文章主要介紹了C#與C++動態(tài)鏈接庫DLL參數(shù)互傳方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
Winform中Treeview實(shí)現(xiàn)按需加載的方法
這篇文章主要介紹了Winform中Treeview實(shí)現(xiàn)按需加載的方法,針對大數(shù)據(jù)量的情況下非常具有實(shí)用價值,需要的朋友可以參考下2014-10-10
C#開發(fā)微信門戶及應(yīng)用(1) 微信接口使用
這篇文章主要為大家詳細(xì)介紹了C#開發(fā)微信門戶及應(yīng)用第一篇,微信接口的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

