介紹完工廠模式,現在來看一下建造者模式。建造者模式就是將一系列對象組裝為一個完整對象並且返回給用戶,例如汽車,就是需要由各個部件來由工人建造成一個複雜的組合實體,這個複雜實體的構造過程就被外部化到一個建造者的對象,由這個建造者對象返回創建好的實體,是不是跟工廠很像呀? 建造者模式則主要由幾個對象構成 ...
介紹完工廠模式,現在來看一下建造者模式。建造者模式就是將一系列對象組裝為一個完整對象並且返回給用戶,例如汽車,就是需要由各個部件來由工人建造成一個複雜的組合實體,這個複雜實體的構造過程就被外部化到一個建造者的對象,由這個建造者對象返回創建好的實體,是不是跟工廠很像呀?
建造者模式則主要由幾個對象構成:
- 抽象建造者
- 具體建造者
- 指揮者
- 產品角色
UML 類圖如下:
抽象建造者負責定義建造者的行為,這裡使用介面/抽象類均可,而具體建造者則實現了抽象建造者,負責具體的建造行為。
指揮者是針對抽象建造者進行變成,是將這些建造者的建造行為進行邏輯處理,不論你傳入哪種不同的建造者,都能保證建造流程一致性。
而建造者模式則是將構造複雜對象的內部與對象的具體表現隔離開來,使得同樣的建造過程可以創造出不同的表現。
上代碼:
// 抽象建造者
public abstract class AbsBuilder
{
public abstract void AddHead();
public abstract void AddBody();
public abstract void AddFoot();
public abstract Product GetResult();
}
// 抽象產品
public abstract class Product
{
public abstract void Show();
}
// 字元串產品 A
public class ProductA : Product
{
public string Content {get; set;}
public override void Show()
{
Console.WriteLine(Content);
}
}
// 整形產品 B
public class ProductB : Product
{
public int Content {get; set;}
public override void Show()
{
Console.WriteLine(Content);
}
}
// 建造者 A,負責構建字元串產品
public class BuilderA : AbsBuilder
{
private ProductA _product = new ProductA();
public override void AddHead()
{
_product.Content += "This is Head\r\n";
}
public override void AddBody()
{
_product.Content += "This is Body\r\n";
}
public override void AddFoot()
{
_product.Content += "This is Foot\r\n";
}
public override Product GetResult()
{
return _product;
}
}
// 建造者 B,負責構建整形產品
public class BuilderB : AbsBuilder
{
private ProductB _product = new ProductB();
public override void AddHead()
{
_product.Content += 1;
}
public override void AddBody()
{
_product.Content += 10;
}
public override void AddFoot()
{
_product.Content += 11;
}
public override Product GetResult()
{
return _product;
}
}
// 指揮者
public class Director
{
public Product Construct(AbsBuilder builder)
{
builder.AddHead();
builder.AddBody();
builder.AddFoot();
return builder.GetResult();
}
}
public class Program
{
public static Main()
{
var director = new Director();
var product = director.Construct(new BuilderA());
var productB = director.Construct(new BuilderB());
product.Show();
productB.Show();
}
}
建造者模式如果需要新增一個建造者的話十分方便,符合開閉原則,只需要編寫一個實現了抽象類的建造者即可,十分方便擴展。
而且對於複雜的對象的構建過程可以在具體的建造者內部進行精細化控制。
- 適用於需要生成的產品對象有複雜的內部結構,這些產品對象通常包含多個成員屬性;
- 需要生成的產品對象的屬性相互依賴,需要指定其生成順序;
- 獨立於創建該對象的類;隔離複雜對象的創建和使用,並使得相同的創建過程可以創建不同類型的產品。