1.什麼是創建者模式?在什麼時候使用?
當我們要創建一個複雜的系統,並且這種系統由着特定的複雜的步驟組合而成,我們要怎麼辦?就像老闆要你去採購一批電腦,電腦的配置各有所不同,品牌也不同,而電腦由不同的部件組成,主板,內存,顯示器,機箱等組成,而你不肯能一個一個零件的去採購,然後在來組裝,這時候,我們就需要去找電腦城的老闆,去找不同品牌的老闆,讓老闆來給你組裝好成品的電腦,你只需要付錢就可以拿到不同的電腦,這就是一個常見的創建者模式,老闆就充當了Builder,從每個老闆那兒拿到不同的配置,不同品牌的電腦。好,我們來實現這個簡單的模式?
2.我們來實現這個系統
我們來實現電腦Class - Computer
/// <summary>
/// 創建者模式
/// </summary>
public class Computer
{
private IList<string> parts = new List<string>();
//把單個組件添加到電腦組合中
public void Add(string part)
{
parts.Add (part);
}
public void Show()
{
Debug.Log ("電腦開始組裝");
foreach(string patrs in parts)
{
Debug.Log ("組件名稱:" + parts +"已經組裝好");
}
Debug.Log (" 電腦組裝結束");
}
}
我們來實現一個抽象的接口class-Builder/// <summary>
/// 電腦的組裝着
/// </summary>
public abstract class Builder
{
//裝CPU
public abstract void BuilderPartCPU ();
//裝主板
public abstract void BuildMainBoard();
//獲得組裝好的電腦
public abstract Computer getComputer();
}
我們在來實現兩個創建者 class - ConcreateBuilder1/// <summary>
/// 具體的創建者
/// </summary>
public class ConcreateBuilder1 : Builder
{
Computer computer = new Computer();
public override void BuilderPartCPU()
{
computer.Add ("CPU1");
}
public override void BuildMainBoard()
{
computer.Add ("Main board1");
}
public override Computer getComputer ()
{
return computer;
}
}
/// <summary>
/// 具體的創建者2
/// </summary>
public class ConcreateBuilder2 : Builder
{
Computer computer = new Computer();
public override void BuilderPartCPU()
{
computer.Add ("CPU2");
}
public override void BuildMainBoard()
{
computer.Add ("Main board2");
}
public override Computer getComputer ()
{
return computer;
}
}
我們來實現一個導演類,也就是古代打仗的時候的將軍,他負責指揮整個戰鬥的進行。
public class Director
{
public void Construct(Builder builder)
{
builder.BuilderPartCPU ();
builder.BuildMainBoard ();
}
}
我們來測試
public class Customer
{
public void MainTest()
{
Builder builder1 = new ConcreateBuilder1 ();
Builder builder2 = new ConcreateBuilder2 ();
Director direct = new Director ();
//老闆讓第一個人去組裝電腦
direct.Construct (builder1);
Computer comp1 = builder1.getComputer ();
comp1.Show ();
//老闆讓第二個人去組裝電腦
direct.Construct(builder2);
Computer comp2 = builder2.getComputer ();
comp2.Show ();
}
}
3。我們來說說他的特點。
(1)指揮者直接與客戶打交道,而客戶也絲毫不用關係產品的構造過程,指揮者把客戶的請求委託給每一個創建者。
(2)建造者模式主要用於“分步驟來構建一個複雜的對象”,其中“分步驟”是一個固定的組合過程,而複雜對象的各個部分是經常變化的(也就是說電腦的內部組件是經常變化的,這裏指的的變化如硬盤的大小變了,CPU由單核變雙核等
(3)產品不需要抽象類,由於建造模式的創建出來的最終產品可能差異很大,所以不大可能提煉出一個抽象產品類
(4)在前面文章中介紹的抽象工廠模式解決了“系列產品”的需求變化,而建造者模式解決的是 “產品部分” 的需要變化
(5 由於建造者隱藏了具體產品的組裝過程,所以要改變一個產品的內部表示,只需要再實現一個具體的建造者就可以了,從而能很好地應對產品組成組件的需求變化。