首頁 » 設計模式 » 生成器(Builder)

生成器(Builder)

作者:

分類:

生成器(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),不會影響手機、手機組裝廠的程式碼。

另外在應用上還可以結合工廠方法模式,讓工廠方法負責生產各種部件,再由生成器組合。

以上為學習過程的紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

    「cian」的個人頭像

    留言

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *