一、抽象工廠的應用場景以及優缺點
1? 應用場景:
? ? ? 如果系統需要多套的代碼解決方案,并且每套的代碼解決方案中又有很多相互關聯的產品類型,并且在系統中我們可以相互替換的使用一套產品的時候可以使用該模式,客戶端不需要依賴具體的實現。
2?優點:
? ? ? 抽象工廠模式將產品的創建工作遲到了具體工廠的子類中,我們聲明工廠類變量的時候是使用的抽象類型,同理,我們使用產品類型也是抽象類型。
? ? ? 這樣做就盡可能的減少了客戶端代碼與產品類之間的依賴,從而降低了系統的耦合度。耦合度降低了,對于后期的維護和擴展就更加的有利。
3?缺點:
? ? ? 抽象工廠模式很難支持增加新產品的變化,這是因為抽象工廠接口中已經明確了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,
? ? ? 這樣就涉及到抽象工廠類的以及所有子類的變化。也就違背了“開放--封閉”原則。
4.實現要點:
? ? ? ?1)、如果沒有應對“多系列對象創建”的需求變化,則沒有必要使用AbstractFactory模式,這時候使用簡單的靜態工廠完全可以。
? ? ? ?2)、"系列對象"指的是這些對象之間有相互依賴、或作用的關系,例如游戲開發場景中“道路”與“房屋”的依賴,“道路”與“地道”的依賴。
? ? ? ?3)、AbstractFactory模式主要在于應對“新系列”的需求變動。其缺點在于難以應對“新對象”的需求變動。
? ? ? ?4)、AbstractFactory模式經常和FactoryMethod模式共同組合來應對“對象創建”的需求變化。
二、模式的組成
1?抽象產品類角色(AbstractProduct):
? ? ? ?為抽象工廠中相互依賴的每種產品定義抽象接口對象,
? ? ? ?也可以這樣說,有幾種產品,就要聲明幾個抽象角色,?每一個抽象角色和一種具體的產品相匹配。
2?具體產品類(ConcreteProduct):
? ? ? ?具體產品類實現了抽象產品類,是針對某個具體產品的實現的類型。
3? 抽象工廠類角色(AbstractFactory):
? ? ? ? 定義了創建一組相互依賴的產品對象的接口操作,每種操作和每種產品一一對應。
4? 具體工廠類角色(ConcreteFactory):
? ? ? ? 實現抽象類里面的所有抽象接口操作,可以創建某系列具體的產品,這些具體的產品是“抽象產品類角色”的子類。
三、代碼
? 1.基本代碼:
#region 創建抽象類/// <summary>/// 房頂抽象類,子類的房頂必須繼承該類/// </summary>public abstract class Roof{/// <summary>/// 創建房頂/// </summary>public abstract void Create();}/// <summary>/// 地板抽象類,子類的地板必須繼承該類/// </summary>public abstract class Floor{/// <summary>/// 創建地板/// </summary>public abstract void Create();}/// <summary>/// 窗戶抽象類,子類的窗戶必須繼承該類/// </summary>public abstract class Window{/// <summary>/// 創建窗戶/// </summary>public abstract void Create();}/// <summary>/// 房門抽象類,子類的房門必須繼承該類/// </summary>public abstract class Door{/// <summary>/// 創建房門/// </summary>public abstract void Create();}/// <summary>/// 桌子抽象類,子類的房門必須繼承該類/// </summary>public abstract class Dask{/// <summary>/// 創建桌子/// </summary>public abstract void Create();}#endregion 創建抽象類#region 實現具體類/// <summary>/// 歐式地板類/// </summary>public class EuropeanFloor : Floor{public override void Create(){Console.WriteLine("創建歐式的地板");}}/// <summary>/// 歐式的房頂/// </summary>public class EuropeanRoof : Roof{public override void Create(){Console.WriteLine("創建歐式的房頂");}}/// <summary>///歐式的窗戶/// </summary>public class EuropeanWindow : Window{public override void Create(){Console.WriteLine("創建歐式的窗戶");}}/// <summary>/// 歐式的房門/// </summary>public class EuropeanDoor : Door{public override void Create(){Console.WriteLine("創建歐式的房門");}}/// <summary>/// 歐式桌子類/// </summary>public class EuropeanDask : Dask{public override void Create(){Console.WriteLine("創建歐式的桌子");}}/// <summary>/// 現代的房頂/// </summary>public class ModernizationRoof : Roof{public override void Create(){Console.WriteLine("創建現代的房頂");}}/// <summary>/// 現代的地板/// </summary>public class ModernizationFloor : Floor{public override void Create(){Console.WriteLine("創建現代的地板");}}/// <summary>/// 現代的窗戶/// </summary>public class ModernizationWindow : Window{public override void Create(){Console.WriteLine("創建現代的窗戶");}}/// <summary>/// 現代的房門/// </summary>public class ModernizationDoor : Door{public override void Create(){Console.WriteLine("創建現代的房門");}}/// <summary>/// 現代的桌子(擴展)/// </summary>public class ModernizationDask : Dask{public override void Create(){Console.WriteLine("創建現代的桌子");}}#endregion 實現具體類#region 創建抽象工廠類/// <summary>/// 抽象工廠類,提供創建不同類型房子的接口/// </summary>public abstract class AbstractFactory{// 抽象工廠提供創建一系列產品的接口,這里作為例子,只給出了房頂、地板、窗戶和房門創建接口public abstract Roof CreateRoof(); //(可多可單)public abstract Floor CreateFloor();public abstract Window CreateWindow();public abstract Door CreateDoor();public abstract Dask CreateDask();//(擴展)}#endregion#region 實現抽象工廠類/// <summary>/// 歐式風格房子的工廠,負責創建歐式風格的房子/// </summary>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();}// 制作歐式桌子(擴展)public override Dask CreateDask(){return new EuropeanDask();}}/// <summary>/// 現在風格房子的工廠,負責創建現代風格的房子/// </summary>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();}// 制作現代桌子只有現代有)public override Dask CreateDask(){return new ModernizationDask();}}#endregion
?
? 2.擴展代碼:
? ?新建一套古典風格的房子:
?
/// <summary>///先為表弟的房子來建立一個工廠類吧/// </summary>public class ClassicalFactory : AbstractFactory{//創建房頂public override Roof CreateRoof(){return new ClassicalRoof();}// 創建地板public override Floor CreateFloor(){return new ClassicalFloor();}// 創建窗戶public override Window CreateWindow(){return new ClassicalWindow();}// 創建房門public override Door CreateDoor(){return new ClassicalDoor();}}/// <summary>///古典的房頂/// </summary>public class ClassicalRoof : Roof{public override void Create(){Console.WriteLine("創建古典的房頂");}}/// <summary>/// 古典的地板/// </summary>public class ClassicalFloor : Floor{public override void Create(){Console.WriteLine("創建古典的地板");}}/// <summary>/// 古典的窗戶/// </summary>public class ClassicalWindow : Window{public override void Create(){Console.WriteLine("創建古典的窗戶");}}/// <summary>/// 古典的房門/// </summary>public class ClassicalDoor: Door{public override void Create(){Console.WriteLine("創建古典的房門");}}
此時,只需要添加五個類:一個是古典風格工廠類,負責創建古典風格的房子,另外幾個類是具有古典風格的房頂、地板、窗戶和房門的具體產品。
? ? ? ?從上面代碼看出,抽象工廠對于系列產品的變化支持 “開放——封閉”原則(指的是要求系統對擴展開放,對修改封? 閉),擴展起來非常簡便,
? ? ? ? 但是,抽象工廠對于增加新產品這種情況就不支持”開放——封閉 “原則,因為要修改創建系列產品的抽象基類 AbstractFactory,增加相應產品的創建方法,這也是抽象工廠的缺點所在。
?
說明:此文章純屬個人筆記,加深記憶,希望以后能寫出自己的作品。
?