文章出處

/// <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("湖南的鴨架子");
        }
    }

此時,只需要添加三個類:一個是湖南具體工廠類,負責創建湖南口味的鴨脖和鴨架,另外兩個類是具有湖南口味的鴨脖類和鴨架類。從上面代碼看出,抽象工廠對于系列產品的變化支持 “開放——封閉”原則(指的是要求系統對擴展開放,對修改封閉),擴展起來非常簡便,但是,抽象工廠對于添加新產品這種情況就不支持”開放——封閉 “原則,這也是抽象工廠的缺點所在

 

 

抽象工廠的缺點:

抽象工廠模式很難支持新種類產品的變化。這是因為抽象工廠接口中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的接口,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了“開發——封閉”原則。

使用抽象工廠模式的系統應該符合那幾個前提:

  • 一個系統不要求依賴產品類實例如何被創建、組合和表達的表達,這點也是所有工廠模式應用的前提。
  • 這個系統有多個系列產品,而系統中只消費其中某一系列產品
  • 系統要求提供一個產品類的庫,所有產品以同樣的接口出現,客戶端不需要依賴具體實現。

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()