模式解釋:
将一個複雜對象的建構與它的表示分離,使得同樣的建構過程可以建立不同的表示。
模式類型: 創造類模式。
适用場景:
1.建立一些複雜的對象時,這些對象的内部組成構件間的建造順序是穩定的,但是對象的内部組成構件面臨着複雜的變化。
2.要建立的複雜對象的算法,獨立于該對象的組成部分,也獨立于組成部分的裝配方法時。
模式角色:
- Proudct(産品類):一般是一個較為複雜的對象,也就是說建立對象的過程比較複雜,一般會有比較多的代碼量。在本類圖中,産品類是一個具體的類,而非抽象類。實際程式設計中,産品類可以是由一個抽象類與它的不同實作組成,也可以是由多個抽象類與他們的實作組成。
- Builder(抽象建造者):引入抽象建造者的目的,是為了将建造的具體過程交與它的子類來實作。這樣更容易擴充。一般至少會有兩個抽象方法,一個用來建造産品,一個是用來傳回産品。
- ConcreteBuilder(建造者):實作抽象類的所有未實作的方法,具體來說一般是兩項任務:組建産品;傳回組建好的産品。
- Director(導演類):負責調用适當的建造者來組建産品,導演類一般不與産品類發生依賴關系,與導演類直接互動的是建造者類。一般來說,導演類被用來封裝程式中易變的部分。
UML圖:
代碼實作:
1.Product類, 具體的産品.
public class Product
{
IList<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("\n産品 建立 ----");
foreach (string part in parts)
{
Console.WriteLine(part);
}
}
}
2.Builder類, 抽象建造者.
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
3.ConcreteBuilder類, 建造者.
public class ConcreteBuilder1 : Builder
{
private Product product = new Product();
public override void BuildPartA()
{
product.Add("部件A");
}
public override void BuildPartB()
{
product.Add("部件B");
}
public override Product GetResult()
{
return product;
}
}
public class ConcreteBuilder2 : Builder
{
private Product product = new Product();
public override void BuildPartA()
{
product.Add("部件X");
}
public override void BuildPartB()
{
product.Add("部件Y");
}
public override Product GetResult()
{
return product;
}
}
4,Director類, 導演.
public class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
5.客戶端調用.
public class Program
{
static void Main(string[] args)
{
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
director.Construct(b1);
Product p1 = b1.GetResult();
p1.Show();
director.Construct(b2);
Product p2 = b2.GetResult();
p2.Show();
Console.Read();
}
}
建造者模式的優點:
首先,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般産品類和建造者類是比較穩定的,是以,将主要的業務邏輯封裝在導演類中對整體而言可以取得比較好的穩定性。
其次,建造者模式很容易進行擴充。如果有新的需求,通過實作一個新的建造者類就可以完成,基本上不用修改之前已經測試通過的代碼,是以也就不會對原有功能引入風險。
建造者模式與工廠模式的差別:
我們可以看到,建造者模式與工廠模式是極為相似的,總體上,建造者模式僅僅隻比工廠模式多了一個“導演類”的角色。在建造者模式的類圖中,假如把這個導演類看做是最終調用的用戶端,那麼圖中剩餘的部分就可以看作是一個簡單的工廠模式了。
與工廠模式相比,建造者模式一般用來建立更為複雜的對象,因為對象的建立過程更為複雜,是以将對象的建立過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是将對象的全部建立過程封裝在工廠類中,由工廠類向用戶端提供最終的産品;而建造者模式中,建造者類一般隻提供産品類中各個元件的建造,而将具體建造過程傳遞給導演類。由導演類負責将各個元件按照特定的規則組建為産品,然後将組建好的産品傳遞給用戶端。
總結:
建造者模式與工廠模式類似,他們都是建立類模式,适用的場景也很相似。一般來說,如果産品的建造很複雜,那麼請用工廠模式;如果産品的建造更複雜,那麼請用建造者模式。