
生成器(Builder)
概念
生成器模式是一種建立型模式,又稱建造模式。將複雜物件的建構過程分離後,使用時再透過生成器(Builder)重新組合。
概念就像是製造業的分工,早期一台家電的全部零件幾乎都自己製造,隨著科技進步,人們對產品要求越來越高,就會將細部零件交專門的廠商製作,最後再組裝起來。像是iPhone也是零件都外包,最後再交由組裝廠組合!來看看下面範例。
範例
//**************
//* author: cian
//* 20231022
//**************
class CellPhone
{
private string cpu = string.empty; //CPU
private string lens = string.empty; //鏡頭
private string romSize = string.empty; //儲存空間
public void setCpu (string _cpu) { cpu = _cpu; }
public void setLens (string _lens) { lens = _lens; }
public void setROMSize (string _romSize) { romSize = _romSize; }
}
/* 生成器: 組裝配方 */
abstract class CellPhoneBuilder
{
protected CellPhone cellPhone;
public void Create() { cellPhone = new CellPhone(); }
public CellPhone Build() { return cellPhone; }
public abstract void SetCPU();
public abstract void SetLens();
public abstract void SetROM();
}
/* iPhone15的實體生成器 */
class IPhone15Builder : CellPhoneBuilder
{
public override void SetCPU()
{
cellPhone.setCpu("A16");
}
public override void SetLens()
{
cellPhone.setLens("4800M");
}
public override void SetROM()
{
cellPhone.setROMSize("128GB");
}
}
/* iPhone15 PRO的實體生成器 */
class IPhone15ProBuilder : CellPhoneBuilder
{
public override void SetCPU()
{
cellPhone.setCpu("A17");
}
public override void SetLens()
{
cellPhone.setLens("4800M");
}
public override void SetROM()
{
cellPhone.setROMSize("1TB");
}
}
/* 手機組裝廠 */
class CellPhoneFactory
{
private CellPhoneBuilder builder;
public void SetBuilder(CellPhoneBuilder _builder)
{
builder = _builder;
}
public CellPhone GenProduct()
{
builder.Create();
builder.SetCPU();
builder.SetLens();
builder.SetROM();
return builder.Build();
}
}
class MainApp
{
static void Main(string[] args)
{
//建立手機組裝廠
CellPhoneFactory factory = new CellPhoneFactory();
//上午生產IPhone15
factory.SetBuilder(new IPhone15Builder());
var IPhone15 = factory.GenProduct();
//下午生產IPhone15PRO
factory.SetBuilder(new IPhone15ProBuilder());
var IPhone15PRO = factory.GenProduct();
}
}
結語
生成器的好處是可以把成品的建立方法拆出,如果要換產品配方只需要更換掉生產線(Builder),不會影響手機、手機組裝廠的程式碼。
另外在應用上還可以結合工廠方法模式,讓工廠方法負責生產各種部件,再由生成器組合。
以上為學習過程的紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言