創造者模式和範例
工作忙+懶惰導致這系列差點難產,不過還是繼續了
任務 : 創建機器,機器A有partI,partJ,機器B有partX,partY
UML : (有點不同,就將就點吧)

1.建立抽象的創造者
程式碼 :
public abstract class Builder
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
說明 : 繼承此抽象的類別必須要會製造PartA和PartB,並且要能得到組合結果。
2.建立part的容器
程式碼 :
public class Machine
{
IList<string> parts = new List<String>();
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("Product has been build");
foreach (var part in parts)
{
Console.WriteLine(part);
}
}
}
說明 : 建立一個機器的容器,可以收納也可以顯示內部有甚麼part
3.機器A、B繼承Builder並完成part的插入
程式碼 :
public class MachineA : Builder
{
private Machine machine = new Machine();
public override void BuildPartA()
{
machine.Add("Part I");
}
public override void BuildPartB()
{
machine.Add("Part J");
}
public override Machine GetResult()
{
return machine;
}
}
public class MachineB : Builder
{
private Machine machine = new Machine();
public override void BuildPartA()
{
machine.Add("Part X");
}
public override void BuildPartB()
{
machine.Add("Part Y");
}
public override Machine GetResult()
{
return machine;
}
}
說明 : 不同的機器分別有不同的part,在類別內實作插入part的動作。
4.建立Director
程式碼 :
public class Director
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
說明 : 因為建立的步驟都是固定的,所以把步驟封裝起來,這樣每個機器組裝的步驟都會相同。
5.使用方式
程式碼 :
static void Main(string[] args)
{
Director director = new Director();
Builder builder1 = new MachineA();
director.Construct(builder1);
Machine product = builder1.GetResult();
product.Show();
Builder builder2 = new MachineB();
director.Construct(builder2);
Machine product2 = builder2.GetResult();
product2.Show();
Console.ReadLine();
}
說明 :
- 建立director等待Builder傳入執行
- 建立Builder為MachineA
- Director代替Builder執行步驟
- 取得此機器的內容
- 顯示內容物
小結 :
創造者模式封裝了步驟,外部不需要知道機器怎麼組裝的,只需要知道組裝的結果,而每個機器的步驟都是先裝PartA再來是PartB,如果順序交換了也只要在Director內顛倒順序,這樣所有建造的步驟就會修改,不用再一個一個修改步驟。
任務2 : 麵Builder
程式碼 :
public class Noodle
{
IList<string> parts = new List<string>();
public void Add(string part)
{
parts.Add(part);
}
public void DishUp()
{
foreach (var part in parts)
{
Console.WriteLine(part);
}
}
}
public abstract class NoodleBuilder
{
public abstract void FirstStep();
public abstract void SecondStep();
public abstract Noodle GetNoodle();
}
public class Yakisoba : NoodleBuilder
{
private Noodle noodle = new Noodle();
public override void FirstStep()
{
noodle.Add("加黃麵");
}
public override Noodle GetNoodle()
{
return noodle;
}
public override void SecondStep()
{
noodle.Add("加醬油");
}
}
public class Udonn : NoodleBuilder
{
private Noodle noodle = new Noodle();
public override void FirstStep()
{
noodle.Add("加烏龍麵");
}
public override Noodle GetNoodle()
{
return noodle;
}
public override void SecondStep()
{
noodle.Add("加湯");
}
}
public class NoodleDirector
{
public void DoProcess(NoodleBuilder noodleBuilder)
{
noodleBuilder.FirstStep();
noodleBuilder.SecondStep();
}
}
static void Main(string[] args)
{
NoodleDirector noodleDirector = new NoodleDirector();
NoodleBuilder yakisobaBuilder = new Yakisoba();
noodleDirector.DoProcess(yakisobaBuilder);
Noodle yakisoba = yakisobaBuilder.GetNoodle();
yakisoba.DishUp();
NoodleBuilder udonnBuilder = new Udonn();
noodleDirector.DoProcess(udonnBuilder);
Noodle ramenn = udonnBuilder.GetNoodle();
ramenn.DishUp();
Console.ReadLine();
}
說明 :
想吃甚麼就把哪個Builder丟進去Director內,裡面會自己把步驟做完後就完成那道料理。
新手上路,若有錯誤請不吝嗇指教,謝謝。