設計模式-工廠模式

設計模式-工廠模式

工廠模式

 簡單工廠的工廠方法在有新需求時需要擴充就會被改動(增加一個switch case 等),這違反了SOLID的OCP - 對擴展開放,對修改封閉。為了解決這件事,工廠模式更進一步將簡單工廠中的工廠類別抽象化,讓每個產品類有一個專屬的工廠類別。更進一步地抽象後,父工廠類別/介面將物件實例化的“權利”交由子類別,子類別自己決定需要實例化那個物件。

範例

  • 抽象父工廠類別或介面

    public interface ICarFactory
    {
        ICar GetCar();
    }
  • 子工廠類別

    public class BmwFactory : ICarFactory
    {
        public ICar GetCar()
        {
            return new Bmw();
        }
    }
    ​
    public class BenzFactory : ICarFactory
    {
        public ICar GetCar()
        {
            return new Benz();
        }
    }
  • 抽象產品類別

    public interface ICar
    {
        void StartEngine();
    }
  • 子產品類別

    public class Bmw : ICar
    {
        public void StartEngine()
        {
            Console.WriteLine("BMW starting engine...");
        }
    }
    ​
    public class Benz : ICar
    {
        public void StartEngine()
        {
            Console.WriteLine("BENZ starting engine...");
        }
    }
  • 主程式碼

    static void Main()
    {
        var bmw = new BmwFactory().GetCar();
        bmw.StartEngine();
    ​
        var benz = new BenzFactory().GetCar();
        benz.StartEngine();
    ​
        Console.Read();
    }

工廠模式解決的問題

日後新需求如需要加多一個汽車品牌 Honda,只需要多加一個施作ICar的Honda子類別和實作ICarFactory的HondaFactory,不需要動到其他程式碼,符合OCP。