設計模式之簡單工廠


工廠模式

工廠模式:顧名思義就是使得這個類的作用和工廠一樣,生產產品,在這里使用,我們就是生產類。工廠模式就是生產類,創建類的模式。

其在父類中提供一個創建對象的方法,允許子類決定實例化對象的類型。

代碼綁定着具體類會導致代碼更脆弱,更缺乏彈性,不易擴展,修改困難。

針對接口編程,可以隔離掉以后系統可能發生的一大堆改變,易於擴展。

用於處理改變,並幫助我們“找出會變化的方面,把它們從不變的部分分離出來”

Demo


比如現在有一個物流公司,之前業務很單一,只做陸上物流,隨着時間的推移,市場的變化,也有了海上物流,那么如何設計出一種實現方式來應對這種在業務邏輯上的不確定性,如果后面在增加一種空中物流,那么將如何設計呢。

如何只有路上物流和海上物流,我們可以只在單獨的類中各自聲明下,后面通過if/eles方式來判斷是那個物流,從而去實現它即可。這樣做沒有問題,可以解決業務上面所面臨的問題,但是確不是軟件開發中最好的實現方式,如果你通過if/eles來實現,那么它們的耦合度太高,后期如果陸上物流發生修改,會導致修改的地方過多,且不易於擴展。

簡單實現邏輯

    /// <summary>
    /// 海上物流
    /// </summary>
    public class AtSeaLogistics
    {
        /// <summary>
        /// 海上發貨
        /// </summary>
        public void SendSeaGoods(string goodName) 
        {
            Console.WriteLine("海上 Send:"+goodName);
        }
    }
    /// <summary>
    /// 陸地物流
    /// </summary>
    public class LandLogistics
    {
        /// <summary>
        /// 陸地發貨
        /// </summary>
        public void SendLandGoods(string goodName)
        {
            Console.WriteLine("陸地 Send:"+goodName);
        }
    }
        static void Main(string[] args)
        {
            int logisticsType = 0;                                      //默認為陸地運輸
            Console.WriteLine("開始發貨");
            if (logisticsType==0)
            {
                LandLogistics land = new LandLogistics();
                land.SendLandGoods("Iphone 13");
            }
            else
            {
                AtSeaLogistics atSea = new AtSeaLogistics();
                atSea.SendSeaGoods("海魚");
            }
            Console.WriteLine("發貨完成");
            Console.ReadKey();
        }

運行后,由於是默認陸地發貨,則調用陸地發貨模塊,進行發貨。

這其實是一種很簡單,也是我們目前寫簡單邏輯最最常用的方式,實現功能沒有問題,可是這種實現方式存在很大的隱患和不可擴展,如果后期在需要添加一種運輸方式,可能得需要在Main()方法中修改才行,運輸方式和物流的耦合性過高,且不易擴展。

下面是使用簡單工廠模式的實現,通過接口去各自實現,各自負責各自的事情,物流公司不需要知道去使用哪一種方式發貨,只需要將貨物交給發貨工廠,發貨工廠根據貨物自己來決定該使用哪一種方式發貨。

工廠模式

    public interface ISendInterface
    {
        void SendGoods(string goodName);
    }
    /// <summary>
    /// 陸地物流
    /// </summary>
    public class LandLogistics:ISendInterface
    {
        /// <summary>
        /// 陸地發貨
        /// </summary>
        public void SendGoods(string goodName)
        {
            Console.WriteLine("陸地 Send:" + goodName);            
        }

        ///// <summary>
        ///// 陸地發貨
        ///// </summary>
        //public void SendLandGoods(string goodName)
        //{
        //    Console.WriteLine("陸地 Send:"+goodName);
        //}
    }
    /// <summary>
    /// 海上物流
    /// </summary>
    public class AtSeaLogistics:ISendInterface
    {
         /// <summary>
        /// 海上發貨
        /// </summary>
        public void SendGoods(string goodName)
        {
            Console.WriteLine("海上 Send:" + goodName);            
        }

        //public void SendSeaGoods(string goodName) 
        //{
        //    Console.WriteLine("海上 Send:"+goodName);
        //}
    }
    /// <summary>
    /// 物流管理,主要用於發貨
    /// </summary>
    public class LogisticsStoreFactory
    {
        ISendInterface sendGood = null;
        public ISendInterface GetSendInterface(int type)
        {
            switch (type)
            {
                case 1:
                    sendGood = new LandLogistics();
                    break;
                case 2:
                    sendGood = new AtSeaLogistics();
                    break;
                default:
                    break;
            }
            return sendGood;
        }
    }

調用實現邏輯

            LogisticsStoreFactory logisticsStore = new LogisticsStoreFactory();
            //陸地運輸
            ISendInterface loadSend = logisticsStore.GetSendInterface(1);
            loadSend.SendGoods("Iphone 13");

            //海上運輸

            ISendInterface atSeaSend = logisticsStore.GetSendInterface(2);
            atSeaSend.SendGoods("海魚");

            Console.WriteLine("發貨完成");
            Console.ReadKey();

現在基本可以看出,簡單工廠在實現過程中,不需要關注去如何實現各自的運輸,只是通過LogisticsStoreFactory工廠類來獲取實現,拿來即用就可以。這樣就實現了解耦,將調用和實現進行了拆分,不需要過多關注它是如何實現,只進行使用即可。

適用場景

  • 在編碼過程中,無法預知對象類別和其具體依賴關系時,可使用簡單工廠。
  • 將創建和實現分離,在不影響其它產品的時候,可自主創建,低耦合,易擴展。

實現方式

  • 定義各個產品類,讓其每個類各自干各自的工作,互相不干擾。
  • 先聲明一個共有的接口,讓所有的產品都實現這個接口。
  • 創建一個空的工廠類,讓其擁有獲取產品的能力,且返回這個共有的接口。
  • 在創建者代碼中找到對於產品構造函數的引用,將其修改為工廠方法的引用,同時將創建產品的代碼移植到工廠方法中。

小寄語

一個人的奮斗,像懷孕一樣,日子久了,總會被看出來的。

人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。

我是哉說,感謝您的閱讀,如果對你有幫助,麻煩點贊,轉發 謝謝。


免責聲明!

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



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