建造者模式
在日常生活中有這樣一個場景,我想要一台電腦,但是我又不想要自己買配件組裝,于是找到一個店鋪把找到滿意的電腦下單,商家在收到我的訂單之後,開始安排技術人員組裝,組裝好之後再把電腦寄過來。
對于一台電腦來說,裡面包含CPU、主機闆、顯示卡、記憶體、硬碟、電源、機箱等等配置,可以把電腦當成一個複雜的對象,CPU,主機闆等電腦配件,又有很多種選擇,但是組裝電腦的過程基本是一樣的,這時候就可以用建造者模式實作這一過程。
意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。
主要解決:主要解決在軟體系統中,有時候面臨着"一個複雜對象"的建立工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是将它們組合在一起的算法卻相對穩定。

我們來已建立一個水杯舉例子,代碼如下。
using System;
namespace _04_Builder
{
/// <summary>
/// 建造者
/// </summary>
class Program
{
static void Main(string[] args)
{
//小明要制作一個運動水杯
Builder b1 = new SportCupBuilder();
Director director = new Director(b1);
director.Create();
Cup cup = new Cup();
cup.Drink();
Console.ReadKey();
}
}
public class Director
{
Builder b = null;
public Director(Builder builder)
{
b = builder;
}
public void Create()
{
b.BuildString();
b.BuildCap();
b.BuildBody();
}
}
//我想定制個水杯
public abstract class Builder
{
public abstract void BuildString();
public abstract void BuildCap();
public abstract void BuildBody();
}
/// <summary>
/// 運動水杯
/// </summary>
public class SportCupBuilder : Builder
{
public override void BuildString()
{
Console.WriteLine("經曆一番工作把杯子繩做好了");
}
public override void BuildCap()
{
Console.WriteLine("杯蓋做好了");
}
public override void BuildBody()
{
Console.WriteLine("杯子主體做好了");
}
}
//這是我們要制作的水杯
public class Cup
{
private string myString;//繩子
private string body; //主體
private string cap; //杯蓋
public string MyString
{
get { return myString; }
set { myString = value; }
}
public string Body
{
get { return body; }
set { body = value; }
}
public string Cap
{
get { return cap; }
set { cap = value; }
}
public void Drink()
{
Console.WriteLine("喝水。。。噸噸噸");
}
}
}
如果說需要在建立另外的一種水杯,同樣是又杯繩,杯蓋,杯體組成的話,就可以仿照
SportCupBuilder
方法在寫一個方法繼承自
Builder
即可。