##一、定義 **講一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一種創建型模式。** ##二、描述 **包含以下四個角色:** ![](https://img2023.cnblogs.com/blog/1780813/202305/1780813-202305 ...
一、定義
講一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。建造者模式是一種創建型模式。
二、描述
包含以下四個角色:
1、Builder(抽象建造者):它為創建一個產品Product對象的各個部件指定抽象介面,在該介面中一般聲明兩類方法:一類是BuildPartX(),用於創建複雜對象的各個部件;另一類是GetResult(),用於返回生成好的複雜對象。Builder既可以是抽象類,也可以是介面。
2、ConcreteBuilder(具體建造者):它實現了Builder介面,實現各個部件的具體構造和裝配方法,定義並明確其所創建的複雜對象,還可以提供一個方法返回創建好的複雜產品(該方法也可以由抽象建造者實現)。
3、Product(產品角色):它是被構建的複雜對象,包含多個組成部件,具體建造者創建該產品的內部表示並定義它的裝配過程。
4、Director(指揮者):指揮者又稱為導演類,它負責安排複雜對象的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其Construct()方法中調用建造者對象的部件構造和裝配方法,完成複雜對象的建造。客戶端一般只需要和指揮者進行交互,在客戶端確定具體建造者類型,並實例化具體建造者對象(也可以通過配置文件和反射機制),然後通過指揮者類的構造函數或者Setter方法將該對象傳入指揮類中。
三、例子
X公司要開發一款角色類游戲,角色根據不同情境具有不同能力,並且隨著升級增強。角色是個複雜的對象,不同角色其性別、面容、服裝、髮型等都有所差異。無論何種角色,創建步驟都大同小異,都需要分步驟創建組成部分,再裝配成一個完整的角色。
Actor:角色類複雜產品,實際業務較為複雜,示例簡化只列出部分屬性且類型為string
public class Actor
{
//角色類型
public string Type { get; set; }
//性別
public string Sex { get; set; }
//面容
public string Face { get; set; }
//服裝
public string Costume { get; set; }
//髮型
public string HairStyle { get; set; }
}
ActorBuilder:游戲角色建造器,充當抽象建造者
public abstract class ActorBuilder
{
protected Actor actor = new Actor();
public abstract void BuildType();
public abstract void BuildSex();
public abstract void BuildFace();
public abstract void BuildCostume();
public abstract void BuildHairStyle();
// 工廠方法 : 返回一個完整的游戲角色對象
public Actor CreateActor()
{
return actor;
}
}
HeroBuilder、AngelBuilder和DevilBuilder:英雄角色、天使角色、魔鬼角色,充當具體建造者。
public class HeroBuilder : ActorBuilder
{
public override void BuildType()
{
actor.Type = "英雄";
}
public override void BuildSex()
{
actor.Sex = "男";
}
public override void BuildFace()
{
actor.Face = "英俊";
}
public override void BuildCostume()
{
actor.Costume = "盔甲";
}
public override void BuildHairStyle()
{
actor.HairStyle = "飄逸";
}
}
public class AngelBuilder : ActorBuilder
{
public override void BuildType()
{
actor.Type = "天使";
}
public override void BuildSex()
{
actor.Sex = "女";
}
public override void BuildFace()
{
actor.Face = "漂亮";
}
public override void BuildCostume()
{
actor.Costume = "白裙";
}
public override void BuildHairStyle()
{
actor.HairStyle = "披肩長髮";
}
}
public class DevilBuilder : ActorBuilder
{
public override void BuildType()
{
actor.Type = "惡魔";
}
public override void BuildSex()
{
actor.Sex = "妖";
}
public override void BuildFace()
{
actor.Face = "醜陋";
}
public override void BuildCostume()
{
actor.Costume = "黑衣";
}
public override void BuildHairStyle()
{
actor.HairStyle = "光頭";
}
}
ActorController:角色控制器,充當指揮者
public class ActorController
{
public Actor Construct(ActorBuilder builder)
{
builder.BuildType();
builder.BuildSex();
builder.BuildFace();
builder.BuildCostume();
builder.BuildHairStyle();
return builder.CreateActor(); ;
}
}
Program:測試代碼
ActorBuilder ab = new HeroBuilder();
ActorController ac = new ActorController();
Actor at = ac.Construct(ab);
Console.WriteLine(at.Type);
Console.WriteLine(at.Sex);
Console.WriteLine(at.Face);
Console.WriteLine(at.Costume);
Console.WriteLine(at.HairStyle);
Console.ReadLine();
四、總結
1、優點
(1)在建造者模式中,客戶端不必知道產品內部的組成細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象。
(2)沒一個具體建造者都相對獨立,與其他的具體建造者無關,因此新增與替換具體建造者很方便,由於指揮者類針對抽象建造者編程,增加新的具體建造者無需修改原有類庫的代碼,系統擴展比較方便,符合開閉原則
(3)用戶可以更加精細地控制產品的創建過程,將複雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,也更方便使用程式來控制創建過程
2、缺點
(1)建造者模式所創建產的品都具有一些較多的共同點,其組成部分相似,如果差異性很大,例如很多組成部分不同,那麼則不適合使用建造者模式。
(2)如果產品的內部結構複雜多變,可能會需要定義很多具體構建者來實現這些變化,導致系統變得很龐大,增加了系統的理解難度和運行成本