在抽象工廠模式開篇之前,我們先思考一個問題,如果我們要設計一套房子,其他的組件暫時不考慮,我們僅僅考慮房頂、地板、窗戶、房門進行設計。什么樣的風格暫時未知,可能會有很多種類。可以先設計一套古典風格的房子,再設計一套現代風格的房子,再設計一套歐式風格的房子....這么多套房子需要設計,需求不斷變化,我們該怎么才能后期的維護和擴展就更有利呢?那當然是減少客戶端代碼與具體產品類之間的依賴,降低了系統的耦合度,這就是抽象工廠模式的優(yōu)點之處。
抽象工廠模式定義抽象工廠模式:提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
抽象產品類角色(AbstractProduct):為抽象工廠中相互依賴的每種產品定義抽象接口對象,也可以這樣說,有幾種產品,就要聲明幾個抽象角色,每一個抽象產品角色和一種具體的產品相匹配。具體產品類(ConcreteProduct):具體產品類實現了抽象產品類,是針對某個具體產品的實現的類型。抽象工廠類角色(Abstract Factory):定義了創(chuàng)建一組相互依賴的產品對象的接口操作,每種操作和每種產品一一對應。具體工廠類角色(ConcreteFactory):實現抽象類里面的所有抽象接口操作,可以創(chuàng)建某系列具體的產品,這些具體的產品是“抽象產品類角色”的子類。抽象工廠模式代碼實現抽象工廠模式的實現,只需要創(chuàng)建三個類:抽象工廠類,具體風格工廠類和具體產品風格實現類。當然也可以分離成四個類,將設計產品接口從抽象工廠分離出來。以設計歐式風格建筑為例:
(資料圖)
創(chuàng)建抽象工廠類
/// /// 抽象工廠類,提供創(chuàng)建不同類型房子的接口 /// public abstract class AbstractFactory { /// /// 抽象工廠提供創(chuàng)建一系列產品的接口——抽象方法,這里作為例子,只給出了房頂、地板、窗戶和房門創(chuàng)建接口 /// 【1】房頂創(chuàng)建接口 /// /// public abstract Roof CreateRoof(); /// /// 【2】地板創(chuàng)建接口 /// /// public abstract Floor CreateFloor(); /// /// 【3】窗戶創(chuàng)建接口 /// /// public abstract Window CreateWindow(); /// /// 【4】房門創(chuàng)建接口 /// /// public abstract Door CreateDoor(); } #region 可以分離出來到單獨Class文件的產品接口 /// /// 房頂抽象類,子類的房頂必須繼承該類 /// public abstract class Roof { /// /// 創(chuàng)建房頂 /// public abstract void Create(); } /// /// 地板抽象類,子類的地板必須繼承該類 /// public abstract class Floor { /// /// 創(chuàng)建地板 /// public abstract void Create(); } /// /// 窗戶抽象類,子類的窗戶必須繼承該類 /// public abstract class Window { /// /// 創(chuàng)建窗戶 /// public abstract void Create(); } /// /// 房門抽象類,子類的房門必須繼承該類 /// public abstract class Door { /// /// 創(chuàng)建房門 /// public abstract void Create(); } #endregion創(chuàng)建歐式風格工廠
/// /// 歐式風格房子的工廠,負責創(chuàng)建歐式風格的房子 /// public class EuropeanFactory : AbstractFactory { // 制作歐式房頂 public override Roof CreateRoof() { return new EuropeanRoof(); } // 制作歐式地板 public override Floor CreateFloor() { return new EuropeanFloor(); } // 制作歐式窗戶 public override Window CreateWindow() { return new EuropeanWindow(); } // 制作歐式房門 public override Door CreateDoor() { return new EuropeanDoor(); } }創(chuàng)建歐式風格實現
/// /// European 歐式風格建筑 /// public class European { /// /// 歐式地板類 /// public class EuropeanFloor : Floor { public override void Create() { Console.WriteLine("創(chuàng)建歐式的地板"); } } /// /// 歐式的房頂 /// public class EuropeanRoof : Roof { public override void Create() { Console.WriteLine("創(chuàng)建歐式的房頂"); } } /// ///歐式的窗戶 /// public class EuropeanWindow : Window { public override void Create() { Console.WriteLine("創(chuàng)建歐式的窗戶"); } } /// /// 歐式的房門 /// public class EuropeanDoor : Door { public override void Create() { Console.WriteLine("創(chuàng)建歐式的房門"); } } }歐式風格調用
public void RunTest() { // 歐式風格的房子 Console.WriteLine("開始設計歐式風格房子!"); AbstractFactory europeanFactory = new EuropeanFactory(); europeanFactory.CreateRoof().Create(); europeanFactory.CreateFloor().Create(); europeanFactory.CreateWindow().Create(); europeanFactory.CreateDoor().Create(); }如果新需求設計新的風格房子,現代風格建筑,只需要創(chuàng)建對應的具體實現工廠和具體產品分風格設計實現。
創(chuàng)建現代風格工廠
/// /// 現在風格房子的工廠,負責創(chuàng)建現代風格的房子 /// public class ModernizationFactory : AbstractFactory { // 制作現代房頂 public override Roof CreateRoof() { return new ModernizationRoof(); } // 制作現代地板 public override Floor CreateFloor() { return new ModernizationFloor(); } // 制作現代窗戶 public override Window CreateWindow() { return new ModernizationWindow(); } // 制作現代房門 public override Door CreateDoor() { return new ModernizationDoor(); } }創(chuàng)建現代風格實現
/// /// Modernization 現代風格建筑 /// public class Modernization { /// /// 現代的房頂 /// public class ModernizationRoof : Roof { public override void Create() { Console.WriteLine("創(chuàng)建現代的房頂"); } } /// /// 現代的地板 /// public class ModernizationFloor : Floor { public override void Create() { Console.WriteLine("創(chuàng)建現代的地板"); } } /// /// 現代的窗戶 /// public class ModernizationWindow : Window { public override void Create() { Console.WriteLine("創(chuàng)建現代的窗戶"); } } /// /// 現代的房門 /// public class ModernizationDoor : Door { public override void Create() { Console.WriteLine("創(chuàng)建現代的房門"); } } }現代風格調用
public void RunTest() { // 歐式風格的房子 Console.WriteLine("開始設計歐式風格房子!"); AbstractFactory europeanFactory = new EuropeanFactory(); europeanFactory.CreateRoof().Create(); europeanFactory.CreateFloor().Create(); europeanFactory.CreateWindow().Create(); europeanFactory.CreateDoor().Create(); //現代風格的房子 Console.WriteLine("開始設計現代風格的房子!"); AbstractFactory modernizationFactory = new ModernizationFactory(); modernizationFactory.CreateRoof().Create(); modernizationFactory.CreateFloor().Create(); modernizationFactory.CreateWindow().Create(); modernizationFactory.CreateDoor().Create(); }抽象工廠模式的優(yōu)缺點優(yōu)點:【抽象工廠模式】將系列產品的創(chuàng)建工作延遲到具體工廠的子類中,我們聲明工廠類變量的時候是使用的抽象類型,同理,我們使用產品類型也是抽象類型,這樣做就盡可能的可以減少客戶端代碼與具體產品類之間的依賴,從而降低了系統的耦合度。耦合度降低了,對于后期的維護和擴展就更有利,這也就是【抽象工廠模式】的優(yōu)點所在。
缺點:【抽象工廠模式】很難支持增加新產品的變化,這是因為抽象工廠接口中已經確定了可以被創(chuàng)建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類以及所有子類的改變,這樣也就違背了“開放—封閉”原則。
營業(yè)執(zhí)照公示信息