iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
自我挑戰組

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

初階面試常見題目回答-抽象工廠模式-鐵人賽第十六日

  • 分享至 

  • xImage
  •  

在介紹完簡單工廠與工廠模式後,
一個是有一個中央工廠,
而另一個是每一個工廠都要獨立出來,
有時候會有一種需求,
但會有多種狀況,
如果要一個個都定好,
那麼就會需要多個工廠。

這時候就會需要延伸一點定義,
說到廣泛的定義,
就會想到抽象,
筆者常說抽象是一個廣泛的定義,
那麼抽象工廠,就是一種廣泛的定義工廠
舉個例子,如果一件件事情都用工廠來區分,
那麼就會有汽車輪胎、摩特車輪胎、飛機輪胎等等的工廠,
但除了各種外在條件限制,導致的耐壓、耐磨等等的不同,
其實他都可以被一間工廠所定義好,
也就是一家輪胎工廠可以負責的,
而不用各種載具的輪胎,甚至細到某種廠牌的輪胎等等的,
這就是抽象工廠所要做的。

抽象工廠模式(Abstract Factory Pattern)
是一種軟體設計模式,同樣屬於創建型模式。它提供了一種創建一系列相關或相互依賴的物件的方式,而無需指定其具體的類別。

抽象工廠模式包含以下幾個主要元素:

抽象工廠(Abstract Factory):提供了創建產品的接口,包含多個創建產品的方法,可創建不同產品。

具體工廠(Concrete Factory):主要是實作抽象工廠中的抽象方法,完成實體產品的建立。

產品(Product):定義產品的規範、特性及功能,可以有多個抽象產品。

具體產品(Concrete Product):實作抽象產品,實體由工廠建立,和實體工廠是多對一的關係。

轉換成程式的話


    #region 抽象產品
    public interface ITire
    {
        void Produce();
    }
    #endregion

    #region 具體產品
    #region 具體產品-摩托車輪胎
    public class MotorbikeTire : ITire
    {
        public void Produce()
        {
            Console.WriteLine("生產摩托車輪胎");
        }
    }
    #endregion

    #region 具體產品-飛機輪胎
    public class PlaneTire : ITire
    {
        public void Produce()
        {
            Console.WriteLine("生產飛機輪胎");
        }
    }
    #endregion

    #region 具體產品-汽車輪胎
    // 具體產品
    public class CarTire : ITire
    {
        public void Produce()
        {
            Console.WriteLine("生產汽車輪胎");
        }
    }

    public class ReinforcedCarTire : CarTire
    {
        public new void Produce()
        {
            Console.WriteLine("生產加強汽車輪胎");
        }
    }

    public class WearResistantCarTire : CarTire
    {
        public new void Produce()
        {
            Console.WriteLine("生產耐磨汽車輪胎");
        }
    }
    #endregion
    #endregion

    #region 抽象工廠
    public interface IAbstractFactory
    {
        ITire CreateTire();
    }
    #endregion

    #region 具體工廠
    #region 具體工廠-汽車輪胎
    public class CarFactory : IAbstractFactory
    {
        public ITire CreateTire()
        {
            return new CarTire();
        }
    }

    public class ReinforcedCarFactory : IAbstractFactory
    {
        public ITire CreateTire()
        {
            return new ReinforcedCarTire();
        }
    }

    public class WearResistantCarFactory : IAbstractFactory
    {
        public ITire CreateTire()
        {
            return new WearResistantCarTire();
        }
    }

    #endregion

    #region 具體工廠-摩托車輪胎
    public class MotorbikeFactory : IAbstractFactory
    {
        public ITire CreateTire()
        {
            return new MotorbikeTire();
        }
    }
    #endregion

    #region 具體工廠-飛機輪胎
    public class PlaneFactory : IAbstractFactory
    {
        public ITire CreateTire()
        {
            return new PlaneTire();
        }
    }
    #endregion
    #endregion

    class Program
    {
        static void Main(string[] args)
        {
            // 生產汽車輪胎
            Client(new CarFactory());
            // 生產加強汽車輪胎
            Client(new ReinforcedCarFactory());
            // 生產耐磨汽車輪胎
            Client(new WearResistantCarFactory());
            // 生產摩托車輪胎
            Client(new MotorbikeFactory());
            // 生產飛機輪胎
            Client(new PlaneFactory());
        }

        static void Client(IAbstractFactory factory)
        {
            var tire = factory.CreateTire();
            tire.Produce();
        }
    }

在這邊可以看到,
抽象工廠模式用了寬度的汽車輪胎、摩特車輪胎、飛機輪胎等等,
筆者也試著透過汽車輪胎進行深度延伸,
這也是一個抽象工廠的特性,
這些都是抽象工廠常見的狀態。


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

尚未有邦友留言

立即登入留言