iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

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

初階面試常見題目回答-簡單工廠模式-鐵人賽第十四日

  • 分享至 

  • xImage
  •  

軟體設計不是為了設計程式,
而是為了設計出好的程式,才去學習軟體設計。

那麼前面大致介紹完模式,
進到所謂的工廠模式,
如果說在此之前是連線路徑缺失,
實際上只要找到關鍵字就能對答如流的話題,
那在這之後,就是稍微需要翻找組合才能知道的東西,

接下來的內容.
並且筆者的程式大多是為了展示而去撰寫,
而非需要而去撰寫的,
可別為了展現而去寫那麼多種工廠模式去在程式碼
不然就會是所謂的過度設計了。

首先當然當仁不讓從簡單的開始
簡單工廠模式(Simple Factory Pattern)
又有另一稱為靜態工廠模式,也是昨日所介紹的創建型模式(Creational Patterns)的一種。

簡單工廠模式(Simple Factory Pattern)。
它是工廠模式的一種簡化版本,用於封裝物件的創建過程,以便在客戶端代碼中使用單一的工廠方法來創建不同的物件。
通常由一個簡單的工廠類別來創建不同類型的物件,客戶端根據參數向工廠請求特定類型的物件實例。

簡單工廠模式主要包含以下幾個元素:

Factory(工廠):負責創建產品的類別,通常只會有一個工廠類別。
Product(產品):定義產品的介面,是一個抽象類別或介面。
ConcreteProduct(具體產品):這是Product的實現類,它實現了產品接口中的方法,由Factory創建。

以程式碼來說,筆者看過有用if...else,或Switch,
筆者這邊用Dictionary來做個示範。


    // 新的工廠類別
    public class CarInformationFactory
    {
        // 私有的字典屬性
        private Dictionary<string, ICarInfomationService> services;

        // 私有的構造函數
        private CarInformationFactory()
        {
            // 初始化字典屬性
            services = new Dictionary<string, ICarInfomationService>();
            services.Add("volvo", new VOLVOService());
            services.Add("amc", new AMCService());
            services.Add("tesla", new TeslaService());
        }

        // 實例方法
        public ICarInfomationService CreateCarInformationService(string local)
        {
            // 檢查參數是否有效
            if (services.ContainsKey(local.ToLower()))
            {
                // 從字典中返回對象
                return services[local.ToLower()];
            }
            else
            {
                // 拋出異常
                throw new ArgumentException("不支援的供應商");
            }
        }

    }

    // 用戶端程式碼
    class Program
    {
        static void Main(string[] args)
        {
            // 創建工廠對象
            CarInformationFactory factory = new CarInformationFactory();

            // 使用工廠方法創建服務對象
            ICarInfomationService volvoService = factory.CreateCarInformationService("volvo");
            ICarInfomationService amcService = factory.CreateCarInformationService("amc");
            ICarInfomationService teslaService = factory.CreateCarInformationService("tesla");

            // 使用服務...
        }
    }

可以看到從以上所提的元素作為切入,

工廠類別(Factory Class):可以看到CarInformationFactory,就會是Factory Class的定義。

產品類別(Product Class):也就是定義產品的介面,而在這裡ICarInfomationService的作用就是Product Class。

具體產品類別(Concrete Product Class):可以看到Concrete Product Class,也就是具體實作的地方。
也就是VOLVOService、AMCService、TeslaService...。

最後從用戶端(Client)看入,以這個範例很明顯的,Client就是透過傳入參數Local,創建不同的具體產品。

簡單工廠模式是工廠模式的一種變體,通常只包含一個工廠類別,該類別負責根據傳遞的參數或條件創建不同的具體產品。
這種模式通常用於創建相關的物件,而不涉及多個不同的工廠類別。

從function專門負責創建繼承相同介面的物件的類別,但需要增加新的產品時,需要修改Factory Class。

昨日提過Creational Patterns是一種設計模式,主要是為了某些特定情境而去解決創建物件的問題,
那這個就是為了解決供應商問題的一種解法。

順帶一提,
簡單工廠模式不屬於 GoF 的 23 個經典設計模式之一喔!
所以還是得學其他23個


上一篇
初階面試常見題目回答-簡單介紹模式-鐵人賽第十三日
下一篇
初階面試常見題目回答-工廠方法模式(Factory Method Pattern)-鐵人賽第十五日
系列文
初階面試常見題目彙整30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言