設計模式-工廠模式
工廠模式
簡單工廠的工廠方法在有新需求時需要擴充就會被改動(增加一個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。