設計模式——工廠方法模式(Factory Method)


在簡單工廠模式中通過工廠Factory獲取不同的對象,但是有一個明顯的缺點——簡單工廠模式系統難以擴展!

一旦添加新產品就不得不修改簡單工廠方法,這樣就會造成簡單工廠的實現邏輯過於復雜,

可以通過工廠方法模式可以解決簡單工廠模式中存在的這個問題,看代碼:

    /// <summary>
    /// 汽車抽象類
    /// </summary>
    public abstract class AuthCar
    {
        /// <summary>
        /// 輸出制造了什么汽車
        /// </summary>
        public abstract void CreatorCar();
    }

    /// <summary>
    /// 派生類-橘黃色轎車
    /// </summary>
    public class _OriangeCar : AuthCar
    {
        public override void CreatorCar()
        {
            Console.WriteLine("生產了橘黃色轎車!");
        }
    }

    /// <summary>
    /// 派生類-黑色轎車
    /// </summary>
    public class _BlackCar : AuthCar
    {
        public override void CreatorCar()
        {
            Console.WriteLine("生產了黑色轎車");
        }
    }

汽車類下面有兩種不同顏色的汽車(橘黃色和黑色),下面通過工廠抽象類得到不同的汽車。

    /// <summary>
    /// 工廠類
    /// </summary>
    public abstract class FactoryCreator
    {
        /// <summary>
        /// 獲取汽車對象
        /// </summary>
        /// <returns></returns>
        public abstract AuthCar _AuthCar();
    }

    /// <summary>
    /// 得到黑色汽車實例
    /// </summary>
    public class BlackCarFactoryMethod : FactoryCreator
    {
        public override AuthCar _AuthCar()
        {
            return new _BlackCar();
        }
    }
    /// <summary>
    /// 得到橘黃色汽車實例
    /// </summary>
    public class OriangeFactoryMethod : FactoryCreator
    {
        public override AuthCar _AuthCar()
        {
            return new _OriangeCar();
        }
    }

測試

class Program
    {
        static void Main(string[] args)
        {
            FactoryCreator factoryCreator = new BlackCarFactoryMethod();

            FactoryCreator factoryCreator = new OriangeFactoryMethod();

            factoryCreator._AuthCar().CreatorCar();

            Console.ReadKey();
        }
    }

使用工廠方法實現的系統,如果系統需要添加新產品時,我們可以利用多態性來完成系統的擴展,對於抽象工廠類和具體工廠中的代碼都不需要做任何改動。

例如,我們我們還想輸出一輛綠色汽車,此時我們只需要定義一個綠色汽車具體工廠類綠色汽車類就可以。而不用像簡單工廠模式中那樣去修改工廠類中的實現(具體指添加case語句)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM