設計模式--工廠模式(個人筆記)
一、應用場景以及優缺點
1.應用場景:
一個類不知道它需要的物件的類。在工廠方法模式中,我們不需要具體產品的類名,我們只需要知道建立它的具體工廠即可。
一個類通過其子類來指定建立那個物件。在工廠模式中,對於抽象工廠類只需要提供一個建立產品的介面,而由其子類來確定具體要建立的物件,在程式執行中,子類物件將覆蓋父類物件,從而使得系統更容易擴充套件。
將建立物件的任務委託給多個工廠子類中的某一個,客戶端在使用時可以無須關心是那一個工廠子類建立產品子類,需要時再動態指定。
2.優點:
在工廠方法中,使用者只需要知道所要產品的具體工廠,無須關係具體的建立過程,甚至不需要具體產品類的類名
在系統增加新的產品時,我們只需要新增一個具體產品類和對應的實現工廠,無需對原工廠進行任何修改,很好地符合了“開閉原則”。
3.缺點:
每次增加一個產品時,都需要增加一個具體類和物件實現工廠,是的系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。
二、模式的組成
抽象工廠角色(Creator): 充當抽象工廠角色,定義工廠類所具有的基本的操作,任何具體工廠都必須繼承該抽象類。
具體工廠角色(ConcreteCreator)
抽象產品角色(Product):充當抽象產品角色,定義了產品型別所有具有的基本操作,具體產品必須繼承該抽象類。
具體產品角色(ConcreteProduct):充當具體產品角色,實現抽象產品類對定義的抽象方法,由具體工廠類建立,它們之間有一一對應的關係。
三、程式碼實現:
【簡單工廠模式】的問題是:如果有新的需求就需要修改工廠類裡面建立產品物件例項的那個方法的實現程式碼,在面向物件設計一個原則就是哪裡有變化,我就封裝哪裡。
還有另外兩個大的原則,其一是:面向抽象程式設計,細節和高層實現都要依賴抽象,第二個原則是:多組合,少繼承。這三個原則是最根本的原則,學習設計模式必須以這三個原則為基點,否則都是枉然。
根據這三大原則又衍生出來6個具體的原則,分別是【單一職責 原則】,【里氏替換原則】,【依賴倒置原則】,【介面隔離原則】、【迪米特法則】和【開閉原則】,
既然工廠類有變化,我們就封裝它,面向抽象程式設計,我們先抽象出一個工廠基類,然後,每個需求就實現一個具體的工廠類,這樣我們就符合了【開閉原則】,讓一個工廠生產一款產品,並一一對應。
我們把具體產品的建立推遲到子類中,此時工廠類(這類是基類了)不再負責所有產品的建立,而只是給出具體工廠必須實現的介面,這樣工廠方法模式就可以允許系統不修改工廠類邏輯的情況下來新增新產品,這樣也就克服了簡單工廠模式中缺點。
public ActionResult eFactory() { // 初始化建立汽車的兩個工廠 Factory1 hongQiCarFactory = new HongQiCarFactory(); Factory1 aoDiCarFactory = new AoDiCarFactory(); // 生產一輛紅旗汽車 Car hongQi = hongQiCarFactory.CreateCar(); hongQi.Go(); //生產一輛奧迪汽車 Car aoDi = aoDiCarFactory.CreateCar(); aoDi.Go(); return View(); }
/// <summary> /// 汽車抽象類 /// </summary> public abstract class Car { // 開始行駛 public abstract void Go(); } /// <summary> /// 紅旗汽車 /// </summary> public class HongQiCar : Car { public override void Go() { Console.WriteLine("紅旗汽車開始行駛了!"); } } /// <summary> /// 奧迪汽車 /// </summary> public class AoDiCar : Car { public override void Go() { Console.WriteLine("奧迪汽車開始行駛了"); } } /// <summary> /// 抽象工廠類 /// </summary> public abstract class Factory1 { // 工廠方法 public abstract Car CreateCar(); } /// <summary> /// 紅旗汽車工廠類 /// </summary> public class HongQiCarFactory : Factory1 { /// <summary> /// 負責生產紅旗汽車 /// </summary> /// <returns></returns> public override Car CreateCar() { return new HongQiCar(); } } /// <summary> /// 奧迪汽車工廠類 /// </summary> public class AoDiCarFactory : Factory1 { /// <summary> /// 負責建立奧迪汽車 /// </summary> /// <returns></returns> public override Car CreateCar() { return new AoDiCar(); } }
使用工廠方法實現的系統,如果系統需要新增新產品時,我們可以利用多型性來完成系統的擴充套件,對於抽象工廠類和具體工廠中的程式碼都不需要做任何改動。
/// <summary> /// 賓士車 /// </summary> public class BenChiCar : Car { /// <summary> /// 重寫抽象類中的方法 /// </summary> public override void Go() { Console.WriteLine("賓士車開始行駛了!"); } } /// <summary> /// 賓士車的工廠類 /// </summary> public class BenChiCarFactory : Factory { /// <summary> /// 負責生產賓士車 /// </summary> /// <returns></returns> public override Car CreateCar() { return new BenChiCar(); } }