文章出處
文章列表
/// <summary> /// 下面以絕味鴨脖連鎖店為例子演示下抽象工廠模式 /// 因為每個地方的喜歡的口味不一樣,有些地方喜歡辣點的,有些地方喜歡吃不辣點 /// 客戶端調用 /// </summary> class Client { static void Main(string[] args) { // 南昌工廠制作南昌的鴨脖和鴨架 AbstractFactory nanChangFactory = new NanChangFactory(); YaBo nanChangYabo = nanChangFactory.CreateYaBo(); nanChangYabo.Print(); YaJia nanChangYajia= nanChangFactory.CreateYaJia(); nanChangYajia.Print(); // 上海工廠制作上海的鴨脖和鴨架 AbstractFactory shangHaiFactory = new ShangHaiFactory(); shangHaiFactory.CreateYaBo().Print(); shangHaiFactory.CreateYaJia().Print(); Console.Read(); } } /// <summary> /// 抽象工廠類,提供創建兩個不同地方的鴨架和鴨脖的接口 /// </summary> public abstract class AbstractFactory { // 抽象工廠提供創建一系列產品的接口,這里作為例子,只給出了絕味中鴨脖和鴨架的創建接口 public abstract YaBo CreateYaBo(); public abstract YaJia CreateYaJia(); } /// <summary> /// 南昌絕味工廠負責制作南昌的鴨脖和鴨架 /// </summary> public class NanChangFactory : AbstractFactory { // 制作南昌鴨脖 public override YaBo CreateYaBo() { return new NanChangYaBo(); } // 制作南昌鴨架 public override YaJia CreateYaJia() { return new NanChangYaJia(); } } /// <summary> /// 上海絕味工廠負責制作上海的鴨脖和鴨架 /// </summary> public class ShangHaiFactory : AbstractFactory { // 制作上海鴨脖 public override YaBo CreateYaBo() { return new ShangHaiYaBo(); } // 制作上海鴨架 public override YaJia CreateYaJia() { return new ShangHaiYaJia(); } } /// <summary> /// 鴨脖抽象類,供每個地方的鴨脖類繼承 /// </summary> public abstract class YaBo { /// <summary> /// 打印方法,用于輸出信息 /// </summary> public abstract void Print(); } /// <summary> /// 鴨架抽象類,供每個地方的鴨架類繼承 /// </summary> public abstract class YaJia { /// <summary> /// 打印方法,用于輸出信息 /// </summary> public abstract void Print(); } /// <summary> /// 南昌的鴨脖類,因為江西人喜歡吃辣的,所以南昌的鴨脖稍微會比上海做的辣 /// </summary> public class NanChangYaBo : YaBo { public override void Print() { Console.WriteLine("南昌的鴨脖"); } } /// <summary> /// 上海的鴨脖沒有南昌的鴨脖做的辣 /// </summary> public class ShangHaiYaBo : YaBo { public override void Print() { Console.WriteLine("上海的鴨脖"); } } /// <summary> /// 南昌的鴨架 /// </summary> public class NanChangYaJia : YaJia { public override void Print() { Console.WriteLine("南昌的鴨架子"); } } /// <summary> /// 上海的鴨架 /// </summary> public class ShangHaiYaJia : YaJia { public override void Print() { Console.WriteLine("上海的鴨架子"); } }
抽象工廠應對需求變更
/// <summary> /// 如果絕味又想開一家湖南的分店時,因為湖南喜歡吃麻的 /// 所以這是有需要有一家湖南的工廠專門制作 /// </summary> public class HuNanFactory : AbstractFactory { // 制作湖南鴨脖 public override YaBo CreateYaBo() { return new HuNanYaBo(); } // 制作湖南鴨架 public override YaJia CreateYaJia() { return new HuNanYajia(); } } /// <summary> /// 湖南的鴨脖 /// </summary> public class HuNanYaBo : YaBo { public override void Print() { Console.WriteLine("湖南的鴨脖"); } } /// <summary> /// 湖南的鴨架 /// </summary> public class HuNanYajia : YaJia { public override void Print() { Console.WriteLine("湖南的鴨架子"); } }
此時,只需要添加三個類:一個是湖南具體工廠類,負責創建湖南口味的鴨脖和鴨架,另外兩個類是具有湖南口味的鴨脖類和鴨架類。從上面代碼看出,抽象工廠對于系列產品的變化支持 “開放——封閉”原則(指的是要求系統對擴展開放,對修改封閉),擴展起來非常簡便,但是,抽象工廠對于添加新產品這種情況就不支持”開放——封閉 “原則,這也是抽象工廠的缺點所在
抽象工廠的缺點:
抽象工廠模式很難支持新種類產品的變化。這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。
使用抽象工廠模式的系統應該符合那幾個前提:
- 一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
- 這個系統有多個系列產品,而系統中只消費其中某一系列產品
- 系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。
文章列表
全站熱搜