設(shè)計模式之簡單工廠

工廠模式

工廠模式:顧名思義就是使得這個類的作用和工廠一樣赴捞,生產(chǎn)產(chǎn)品,在這里使用橱乱,我們就是生產(chǎn)類辜梳。工廠模式就是生產(chǎn)類,創(chuàng)建類的模式泳叠。

其在父類中提供一個創(chuàng)建對象的方法作瞄,允許子類決定實例化對象的類型。

代碼綁定著具體類會導(dǎo)致代碼更脆弱危纫,更缺乏彈性宗挥,不易擴展,修改困難种蝶。

針對接口編程契耿,可以隔離掉以后系統(tǒng)可能發(fā)生的一大堆改變,易于擴展螃征。

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

Demo

image.png

比如現(xiàn)在有一個物流公司盯滚,之前業(yè)務(wù)很單一踢械,只做陸上物流酗电,隨著時間的推移,市場的變化内列,也有了海上物流撵术,那么如何設(shè)計出一種實現(xiàn)方式來應(yīng)對這種在業(yè)務(wù)邏輯上的不確定性,如果后面在增加一種空中物流德绿,那么將如何設(shè)計呢荷荤。

如何只有路上物流和海上物流,我們可以只在單獨的類中各自聲明下移稳,后面通過if/eles方式來判斷是那個物流蕴纳,從而去實現(xiàn)它即可。這樣做沒有問題个粱,可以解決業(yè)務(wù)上面所面臨的問題古毛,但是確不是軟件開發(fā)中最好的實現(xiàn)方式,如果你通過if/eles來實現(xiàn)都许,那么它們的耦合度太高稻薇,后期如果陸上物流發(fā)生修改,會導(dǎo)致修改的地方過多胶征,且不易于擴展塞椎。

簡單實現(xiàn)邏輯

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

運行后,由于是默認(rèn)陸地發(fā)貨睛低,則調(diào)用陸地發(fā)貨模塊案狠,進(jìn)行發(fā)貨。


結(jié)果

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

下面是使用簡單工廠模式的實現(xiàn),通過接口去各自實現(xiàn)操刀,各自負(fù)責(zé)各自的事情烁挟,物流公司不需要知道去使用哪一種方式發(fā)貨,只需要將貨物交給發(fā)貨工廠馍刮,發(fā)貨工廠根據(jù)貨物自己來決定該使用哪一種方式發(fā)貨信夫。

工廠模式

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

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

        //public void SendSeaGoods(string goodName) 
        //{
        //    Console.WriteLine("海上 Send:"+goodName);
        //}
    }
    /// <summary>
    /// 物流管理,主要用于發(fā)貨
    /// </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;
        }
    }

調(diào)用實現(xiàn)邏輯

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

            //海上運輸

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

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

現(xiàn)在基本可以看出,簡單工廠在實現(xiàn)過程中静稻,不需要關(guān)注去如何實現(xiàn)各自的運輸警没,只是通過LogisticsStoreFactory工廠類來獲取實現(xiàn),拿來即用就可以振湾。這樣就實現(xiàn)了解耦杀迹,將調(diào)用和實現(xiàn)進(jìn)行了拆分,不需要過多關(guān)注它是如何實現(xiàn)押搪,只進(jìn)行使用即可树酪。

適用場景

  • 在編碼過程中,無法預(yù)知對象類別和其具體依賴關(guān)系時大州,可使用簡單工廠续语。
  • 將創(chuàng)建和實現(xiàn)分離,在不影響其它產(chǎn)品的時候厦画,可自主創(chuàng)建疮茄,低耦合,易擴展根暑。

實現(xiàn)方式

  • 定義各個產(chǎn)品類力试,讓其每個類各自干各自的工作,互相不干擾排嫌。
  • 先聲明一個共有的接口畸裳,讓所有的產(chǎn)品都實現(xiàn)這個接口。
  • 創(chuàng)建一個空的工廠類淳地,讓其擁有獲取產(chǎn)品的能力怖糊,且返回這個共有的接口。
  • 在創(chuàng)建者代碼中找到對于產(chǎn)品構(gòu)造函數(shù)的引用薇芝,將其修改為工廠方法的引用蓬抄,同時將創(chuàng)建產(chǎn)品的代碼移植到工廠方法中丰嘉。

小寄語

一個人的奮斗夯到,像懷孕一樣,日子久了饮亏,總會被看出來的耍贾。

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

我是阿輝,感謝您的閱讀简肴,如果對你有幫助晃听,麻煩點贊,轉(zhuǎn)發(fā) 謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末能扒,一起剝皮案震驚了整個濱河市佣渴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌初斑,老刑警劉巖辛润,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異见秤,居然都是意外死亡砂竖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門鹃答,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎澄,“玉大人,你說我怎么就攤上這事测摔∪玻” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵避咆,是天一觀的道長舟肉。 經(jīng)常有香客問我,道長查库,這世上最難降的妖魔是什么路媚? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮樊销,結(jié)果婚禮上整慎,老公的妹妹穿的比我還像新娘。我一直安慰自己围苫,他們只是感情好裤园,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剂府,像睡著了一般拧揽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腺占,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天淤袜,我揣著相機與錄音,去河邊找鬼衰伯。 笑死铡羡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的意鲸。 我是一名探鬼主播烦周,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尽爆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了读慎?” 一聲冷哼從身側(cè)響起教翩,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贪壳,沒想到半個月后饱亿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡闰靴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年彪笼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚂且。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡配猫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杏死,到底是詐尸還是另有隱情泵肄,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布淑翼,位于F島的核電站腐巢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玄括。R本人自食惡果不足惜冯丙,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遭京。 院中可真熱鬧胃惜,春花似錦、人聲如沸哪雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斯嚎。三九已至利虫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孝扛,已是汗流浹背列吼。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工幽崩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苦始,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓慌申,卻偏偏與公主長得像陌选,于是被迫代替她去往敵國和親理郑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容