1. 程式人生 > >C#設計模式——工廠方法模式

C#設計模式——工廠方法模式

osc tor cas 模式 main csharp plan ofa mar

一、引言

  在簡單工廠中講到簡單工廠模式的缺點,有一點是——簡單工廠模式系統難以擴展,一旦添加新產品就不得不修改簡單工廠方法,這樣就會造成簡單工廠的實現邏輯過於復雜,然而本專題介紹的工廠方法模式可以解決簡單工廠模式中存在的這個問題,下面就具體看看工廠模式是如何解決該問題的。

二、工廠方法模式的實現

  工廠方法模式之所以可以解決簡單工廠的模式,是因為它的實現把具體產品的創建推遲到子類中,此時工廠類不再負責所有產品的創建,而只是給出具體工廠必須實現的接口,這樣工廠方法模式就可以允許系統不修改工廠類邏輯的情況下來添加新產品,這樣也就克服了簡單工廠模式中缺點。下面看下工廠模式的具體實現代碼(這裏還是以簡單工廠模式中點菜的例子來實現):

    /// <summary>
    /// 菜的抽象對象
    /// </summary>
    public abstract class Food
    {
        // 輸出點了什麽菜
        public abstract void Print();
    }
    /// <summary>
    /// 炒土豆絲
    /// </summary>
    public class FriedPotatoShreds : Food
    {
        public override void Print()
        {
            Console.WriteLine("炒土豆絲");
        }
    }
    /// <summary>
    /// 尖椒炒雞蛋
    /// </summary>
    public class PepperFriedEgg : Food
    {
        public override void Print()
        {
            Console.WriteLine("尖椒炒雞蛋!");
        }
    }
    /// <summary>
    /// 西紅柿炒雞蛋
    /// </summary>
    public class ScrambledEggTomato : Food
    {
        public override void Print()
        {
            Console.WriteLine("一份西紅柿炒蛋!");
        }
    }
    /// <summary>
    /// 抽象工廠類
    /// </summary>
    public abstract class Creator
    {
        // 工廠方法
        public abstract Food CreateFoddFactory();
    }

    /// <summary>
    /// 炒土豆絲工廠
    /// </summary>
    public class FriedPotatoShredsFactory : Creator
    {
        public override Food CreateFoddFactory()
        {
            return new FriedPotatoShreds();
        }
    }
    /// <summary>
    /// 尖椒炒雞蛋工廠
    /// </summary>
    public class PepperFriedEggFactory : Creator
    {
        public override Food CreateFoddFactory()
        {
            return new PepperFriedEgg();
        }
    }
    /// <summary>
    /// 西紅柿炒雞蛋工廠
    /// </summary>
    public class ScrambledEggTomatoFactory : Creator
    {
        public override Food CreateFoddFactory()
        {
            return new ScrambledEggTomato();
        }
    }

  

  /// <summary>
        /// 客戶端調用
        /// </summary>
        class Client
        {
            static void Main(string[] args)
            {
                // 初始化做菜的兩個工廠()
                Creator scrambledEggTomatoFactory = new ScrambledEggTomatoFactory();
                Creator pepperFriedEggFactory = new PepperFriedEggFactory();

                // 開始做西紅柿炒蛋
                Food tomatoScrambleEggs = pepperFriedEggFactory.CreateFoddFactory();
                tomatoScrambleEggs.Print();

                //開始做土豆肉絲
                Food shreddedPorkWithPotatoes = scrambledEggTomatoFactory.CreateFoddFactory();
                shreddedPorkWithPotatoes.Print();

                Console.Read();
            }
        }

  使用工廠方法實現的系統,如果系統需要添加新產品時,我們可以利用多態性來完成系統的擴展,對於抽象工廠類和具體工廠中的代碼都不需要做任何改動。例如,我們我們還想點一個“肉末茄子”,此時我們只需要定義一個肉末茄子具體工廠類肉末茄子類就可以。而不用像簡單工廠模式中那樣去修改工廠類中的實現(具體指添加case語句)。具體代碼為:

/// <summary>
    /// 肉末茄子這道菜
    /// </summary>
    public class MincedMeatEggplant : Food
    {
        /// <summary>
        /// 重寫抽象類中的方法
        /// </summary>
        public override void Print()
        {
            Console.WriteLine("肉末茄子好了");
        }
    }
 /// <summary>
    /// 肉末茄子工廠類,負責創建肉末茄子這道菜
    /// </summary>
    public class MincedMeatEggplantFactory : Creator
    {
        /// <summary>
        /// 負責創建肉末茄子這道菜
        /// </summary>
        /// <returns></returns>
        public override Food CreateFoddFactory()
        {
            return new MincedMeatEggplant();
        }
    }

    /// <summary>
    /// 客戶端調用
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
           
            // 如果客戶又想點肉末茄子了
            // 再另外初始化一個肉末茄子工廠
            Creator minceMeatEggplantFactor = new MincedMeatEggplantFactory();

            // 利用肉末茄子工廠來創建肉末茄子這道菜
            Food minceMeatEggplant = minceMeatEggplantFactor.CreateFoddFactory();
            minceMeatEggplant.Print();

            Console.Read();
        }
    }

  

廠方法模式的定義

定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法模式讓一個類的實例化延遲到其子類。

工廠方法模式的結構

技術分享

總結:Factory Method模式

定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法模式讓一個類的實例化延遲到其子類。

Factory Method—參與者

C#設計模式——工廠方法模式