亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#設計模式(3)——工廠方法模式

2019-11-17 02:45:23
字體:
來源:轉載
供稿:網友

C#設計模式(3)——工廠方法模式

原文地址:http://www.49028c.com/zhili/p/FactoryMethod.html

一、引言

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

二、工廠方法模式的實現

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

復制代碼
namespace 設計模式之工廠方法模式{    /// <summary>    /// 菜抽象類    /// </summary>    public abstract class Food    {        // 輸出點了什么菜        public abstract void PRint();    }    /// <summary>    /// 西紅柿炒雞蛋這道菜    /// </summary>    public class TomatoScrambledEggs : Food    {        public override void Print()        {            Console.WriteLine("西紅柿炒蛋好了!");        }    }    /// <summary>    /// 土豆肉絲這道菜    /// </summary>    public class ShreddedPorkWithPotatoes : Food    {        public override void Print()        {            Console.WriteLine("土豆肉絲好了");        }    }    /// <summary>    /// 抽象工廠類    /// </summary>    public abstract class Creator    {        // 工廠方法        public abstract Food CreateFoddFactory();    }    /// <summary>    /// 西紅柿炒蛋工廠類    /// </summary>    public class TomatoScrambledEggsFactory:Creator    {        /// <summary>        /// 負責創建西紅柿炒蛋這道菜        /// </summary>        /// <returns></returns>        public override Food CreateFoddFactory()        {            return new TomatoScrambledEggs();        }    }    /// <summary>    /// 土豆肉絲工廠類    /// </summary>    public class ShreddedPorkWithPotatoesFactory:Creator    {        /// <summary>        /// 負責創建土豆肉絲這道菜        /// </summary>        /// <returns></returns>        public override Food CreateFoddFactory()        {            return new ShreddedPorkWithPotatoes();        }    }    /// <summary>    /// 客戶端調用    /// </summary>    class Client    {        static void Main(string[] args)        {            // 初始化做菜的兩個工廠()            Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();            Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();            // 開始做西紅柿炒蛋            Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory();            tomatoScrambleEggs.Print();            //開始做土豆肉絲            Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.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();        }    }  
復制代碼

三、工廠方法模式的UML圖

講解完工廠模式的具體實現之后,讓我們看下工廠模式中各類之間的UML圖:

從UML圖可以看出,在工廠方法模式中,工廠類與具體產品類具有平行的等級結構,它們之間是一一對應的。針對UML圖的解釋如下:

Creator類:充當抽象工廠角色,任何具體工廠都必須繼承該抽象類

TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory類:充當具體工廠角色,用來創建具體產品

Food類:充當抽象產品角色,具體產品的抽象類。任何具體產品都應該繼承該類

TomatoScrambledEggs和ShreddedPorkWithPotatoes類:充當具體產品角色,實現抽象產品類對定義的抽象方法,由具體工廠類創建,它們之間有一一對應的關系。

四、.NET中實現了工廠方法的類

.NET 類庫中也有很多實現了工廠方法的類,例如asp.net中,處理程序對象是具體用來處理請求,當我們請求一個*.aspx的文件時,此時會映射到System.Web.UI.PageHandlerFactory類上進行處理,而對*.ashx的請求將映射到System.Web.UI.SimpleHandlerFactory類中(這兩個類都是繼承于IHttpHandlerFactory接口的),關于這點說明我們可以在“C:/Windows/Microsoft.NET/Framework/v4.0.30319/Config/Web.Config”文件中找到相關定義,具體定義如下:

 <httpHandlers><add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />            <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />            <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" /></httpHandlers>

下面我們就具體看下工廠方法模式在Asp.net中是如何實現的,如果對一個Index.aspx頁面發出請求時,將會調用PageHandlerFactory中GetHandler方法來創建一個Index.aspx對象,它們之間的類圖關系如下:

五、總結

工廠方法模式通過面向對象編程中的多態性來將對象的創建延遲到具體工廠中,從而解決了簡單工廠模式中存在的問題,也很好地符合了開放封閉原則(即對擴展開發,對修改封閉)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本亚洲视频| 欧美大秀在线观看| 精品亚洲国产视频| 国产成人免费91av在线| 日韩电影中文 亚洲精品乱码| 国产精品国产自产拍高清av水多| 亚洲美女精品久久| 亚洲第一色在线| 国产91精品久久久久| 国产精品国产福利国产秒拍| 中文字幕国产精品久久| 久久精品国产亚洲| 日韩欧美亚洲范冰冰与中字| 精品国产一区二区三区久久久| 日韩亚洲第一页| 久久九九热免费视频| 国产精品男女猛烈高潮激情| 欧洲中文字幕国产精品| 成人性生交xxxxx网站| 欧美一区二区大胆人体摄影专业网站| 国产精品久久久精品| 色多多国产成人永久免费网站| 亚洲欧美综合图区| 精品国产一区二区三区四区在线观看| 福利一区福利二区微拍刺激| 亚洲毛茸茸少妇高潮呻吟| 青青a在线精品免费观看| 欧美一级成年大片在线观看| 成人黄色免费在线观看| 97视频在线免费观看| 日韩av在线电影网| 精品国产依人香蕉在线精品| 国产精品黄视频| 日韩午夜在线视频| 精品日本高清在线播放| 亚洲精品免费av| 国产第一区电影| 97超视频免费观看| 亚洲国产欧美一区二区丝袜黑人| 成人免费网站在线| 国产亚洲成av人片在线观看桃| 国产精品激情av电影在线观看| 国产亚洲精品美女久久久久| 亚洲影院色无极综合| 亚洲国产精品推荐| 国内精品久久久久久中文字幕| …久久精品99久久香蕉国产| 91av在线免费观看视频| 亚洲高清久久网| 欧美国产日韩xxxxx| 国产日韩亚洲欧美| 久久久精品网站| 欧美大片网站在线观看| 日本久久久久久| 青青久久av北条麻妃黑人| 国精产品一区一区三区有限在线| 久久久久女教师免费一区| 欧洲成人在线观看| 欧美黑人性猛交| 日韩在线高清视频| www欧美日韩| 午夜精品久久久久久久99热浪潮| 日本乱人伦a精品| 成人网在线免费观看| 国产精品激情av电影在线观看| 欧美日韩国产丝袜美女| 狠狠色狠狠色综合日日五| 亚洲欧美国产视频| 国产日韩在线亚洲字幕中文| 亚洲精品乱码久久久久久金桔影视| 中文字幕精品一区二区精品| 成人a免费视频| 中文字幕一精品亚洲无线一区| 亚洲激情中文字幕| 亚洲尤物视频网| 2019中文字幕全在线观看| 国内免费精品永久在线视频| 国产一区二区三区网站| 成人国内精品久久久久一区| 亚洲国产第一页| 国产日韩在线亚洲字幕中文| 欧美电影免费观看| 成人欧美一区二区三区黑人孕妇| 久久综合88中文色鬼| 91久久综合亚洲鲁鲁五月天| 日韩高清不卡av| 在线电影av不卡网址| 日韩av在线电影网| 亚洲精品黄网在线观看| 国产精品美女久久久免费| 久久视频在线直播| 亚洲欧洲国产精品| 在线精品91av| 国产精品高潮呻吟久久av黑人| 中文字幕日韩欧美在线视频| 色噜噜狠狠色综合网图区| 欧美激情综合色综合啪啪五月| 日韩视频―中文字幕| 91在线高清免费观看| 97婷婷涩涩精品一区| 萌白酱国产一区二区| 欧美电影院免费观看| 国产精品视频久久久久| 国产精品狠色婷| 97精品一区二区三区| 亚洲乱亚洲乱妇无码| 中文精品99久久国产香蕉| 国产亚洲a∨片在线观看| 91sa在线看| 国产精品高清在线观看| 国产中文日韩欧美| 亚洲国产高清福利视频| 亚洲国产中文字幕久久网| 国产精品对白刺激| 欧美电影在线观看完整版| 亚洲曰本av电影| 色99之美女主播在线视频| 亚洲成色777777女色窝| 欧美激情伊人电影| 国产中文字幕91| 国语自产精品视频在线看抢先版图片| 国产精品亚洲精品| 欧美与黑人午夜性猛交久久久| 日韩电视剧免费观看网站| 久久久av一区| 国产日本欧美一区| 91社影院在线观看| 欧美成人精品不卡视频在线观看| 伊人一区二区三区久久精品| 91久久中文字幕| 成人免费网站在线看| 高清一区二区三区四区五区| 国产999精品久久久影片官网| 国产亚洲一区二区在线| 国产精品久久久久久久天堂| 亚洲电影免费观看高清完整版| 欧美成人剧情片在线观看| 国产有码一区二区| 国产精品69av| 欧美天天综合色影久久精品| 久久网福利资源网站| 日韩精品免费在线视频| 成人美女av在线直播| 久久亚洲综合国产精品99麻豆精品福利| 2019中文字幕在线免费观看| 亚洲色无码播放| 欧美日韩精品在线视频| 久久久最新网址| 日韩专区在线观看| 97视频免费在线看| 亚洲毛片在线免费观看| 九九热精品视频国产| 亚洲一区av在线播放| 51久久精品夜色国产麻豆| 久久久伊人欧美| 亚洲午夜久久久久久久| 日韩激情视频在线播放| 午夜精品理论片| 欧美最近摘花xxxx摘花| 激情亚洲一区二区三区四区| 国产亚洲精品久久| 欧美性理论片在线观看片免费| 成人xxxxx| 国内精久久久久久久久久人|