iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
自我挑戰組

初階面試常見題目彙整系列 第 17

初階面試常見題目回答-建造者模式-鐵人賽第十七日

  • 分享至 

  • xImage
  •  

看到這裡,
很容易發現,
前面不論是簡單工廠、工廠,抑或是廣泛一點的抽象,
都會限制固定出一個固定的格式。

在昨日關於抽象工廠,
筆者故意延伸汽車輪胎的概念,
讓工廠更多點彈性。

但這樣還是不夠,
在程式中總會出現一些特別的需求,
在某些狀況下會需要不同的設計,
或是這樣更為複雜,
反過來說會有不一樣的狀況產生,
而這時候,就會使用到建造者模式,
也就是俗稱的客製化。

而建造者模式(Builder Pattern)
簡單來說,
就是創建歸創建、使用歸使用,
創建好許多物件後,
想要使用在來使用就可以。

建造者模式(Builder Pattern)是一種軟體設計模式,屬於創建型模式。它主要用於創建複雜的物件,並將創建過程分離出來,使得同一個建造過程可以創建不同的表示。

建造者(Builder):是一個介面或抽象類別,它定義了創建產品的各個步驟和方法,例如創建部件、組裝部件、返回產品等。

具體建造者(Concrete Builder):是實現抽象建造者介面的類,它提供了具體的創建產品的過程和細節。

指揮者(Director):是負責指導具體建造者如何構建產品的類,它根據客戶端的需求和偏好來選擇合適的具體建造者,並調用其相應的方法來完成產品的創建。

產品(Product):是要構建的複雜對象,它通常由多個部件組成,這些部件可以是不同的類型和形式。

例如如果一輛車輛的顏色與天窗為可選,
如何要透過建造者模式(Builder Pattern)
程式碼為如下

public abstract class CarInfomationModel
{
    public string Color { get; set; }
	public string Sunroof { get; set; }

}

public class VolvoCarInfomationModel : CarInfomationModel
{
    public class VolvoBuilder : Builder
    {
        public VolvoBuilder() : base(new VolvoCarInfomationModel()) { }
    }
}

public class CarInfomationModelBuilder
{
    private CarInfomationModel carInfo;

    public CarInfomationModelBuilder(CarInfomationModel carInfo)
    {
        this.carInfo = carInfo;
    }

    public CarInfomationModelBuilder WithSunroof(string supplier)
    {
        carInfo.Sunroof = sunroof;
        return this;
    }

    public CarInfomationModelBuilder WithColor(string color)
    {
        carInfo.Color = color;
        return this;
    }

    public CarInfomationModel Build()
    {
        return carInfo;
    }
}

var volvoCarInfo = new CarInfomationModelBuilder(new VolvoCarInfomationModel())
    .WithSunroof("Have")
    .WithColor("Red")
    .Build();
	

在實際運用後可以發現,建造者模式會帶來很明顯的彈性,
就以昨天的輪胎例子,
其實就能用建造者模式會更為簡單。

而除此之外,
工廠之間很常互相配合,
就算是同屬創建型模式,
也不代表說不能同時使用,
同樣以抽象工廠來說,
抽象工廠是一個廣泛的概念,
那麼一旦代指群體上的事情,
在一些細節的添加,
就會比較麻煩,
這時候也會用建造者模式協助,
其實就如上所述,
過於簡單的功能,
引入抽象工廠會太過於複雜。

最後再說一句比較官方的話,
實際情況已當下狀況為準。


上一篇
初階面試常見題目回答-抽象工廠模式-鐵人賽第十六日
下一篇
初階面試常見題目回答-策略模式-鐵人賽第十八日
系列文
初階面試常見題目彙整30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言