麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#設(shè)計(jì)模式(3)——工廠方法模式

2019-11-17 02:45:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

C#設(shè)計(jì)模式(3)——工廠方法模式

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

一、引言

  在簡(jiǎn)單工廠模式中講到簡(jiǎn)單工廠模式的缺點(diǎn),有一點(diǎn)是——簡(jiǎn)單工廠模式系統(tǒng)難以擴(kuò)展,一旦添加新產(chǎn)品就不得不修改簡(jiǎn)單工廠方法,這樣就會(huì)造成簡(jiǎn)單工廠的實(shí)現(xiàn)邏輯過(guò)于復(fù)雜,然而本專題介紹的工廠方法模式可以解決簡(jiǎn)單工廠模式中存在的這個(gè)問(wèn)題,下面就具體看看工廠模式是如何解決該問(wèn)題的。

二、工廠方法模式的實(shí)現(xiàn)

  工廠方法模式之所以可以解決簡(jiǎn)單工廠的模式,是因?yàn)樗膶?shí)現(xiàn)把具體產(chǎn)品的創(chuàng)建推遲到子類中,此時(shí)工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而只是給出具體工廠必須實(shí)現(xiàn)的接口,這樣工廠方法模式就可以允許系統(tǒng)不修改工廠類邏輯的情況下來(lái)添加新產(chǎn)品,這樣也就克服了簡(jiǎn)單工廠模式中缺點(diǎn)。下面看下工廠模式的具體實(shí)現(xiàn)代碼(這里還是以簡(jiǎn)單工廠模式中點(diǎn)菜的例子來(lái)實(shí)現(xiàn)):

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

使用工廠方法實(shí)現(xiàn)的系統(tǒng),如果系統(tǒng)需要添加新產(chǎn)品時(shí),我們可以利用多態(tài)性來(lái)完成系統(tǒng)的擴(kuò)展,對(duì)于抽象工廠類和具體工廠中的代碼都不需要做任何改動(dòng)。例如,我們我們還想點(diǎn)一個(gè)“肉末茄子”,此時(shí)我們只需要定義一個(gè)肉末茄子具體工廠類肉末茄子類就可以。而不用像簡(jiǎn)單工廠模式中那樣去修改工廠類中的實(shí)現(xiàn)(具體指添加case語(yǔ)句)。具體代碼為:

復(fù)制代碼
 /// <summary>    /// 肉末茄子這道菜    /// </summary>    public class MincedMeatEggplant : Food    {        /// <summary>        /// 重寫抽象類中的方法        /// </summary>        public override void Print()        {            Console.WriteLine("肉末茄子好了");        }    } /// <summary>    /// 肉末茄子工廠類,負(fù)責(zé)創(chuàng)建肉末茄子這道菜    /// </summary>    public class MincedMeatEggplantFactory : Creator    {        /// <summary>        /// 負(fù)責(zé)創(chuàng)建肉末茄子這道菜        /// </summary>        /// <returns></returns>        public override Food CreateFoddFactory()        {            return new MincedMeatEggplant();        }    }    /// <summary>    /// 客戶端調(diào)用    /// </summary>    class Client    {        static void Main(string[] args)        {                       // 如果客戶又想點(diǎn)肉末茄子了            // 再另外初始化一個(gè)肉末茄子工廠            Creator minceMeatEggplantFactor = new MincedMeatEggplantFactory();            // 利用肉末茄子工廠來(lái)創(chuàng)建肉末茄子這道菜            Food minceMeatEggplant = minceMeatEggplantFactor.CreateFoddFactory();            minceMeatEggplant.Print();            Console.Read();        }    }  
復(fù)制代碼

三、工廠方法模式的UML圖

講解完工廠模式的具體實(shí)現(xiàn)之后,讓我們看下工廠模式中各類之間的UML圖:

從UML圖可以看出,在工廠方法模式中,工廠類與具體產(chǎn)品類具有平行的等級(jí)結(jié)構(gòu),它們之間是一一對(duì)應(yīng)的。針對(duì)UML圖的解釋如下:

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

TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory類:充當(dāng)具體工廠角色,用來(lái)創(chuàng)建具體產(chǎn)品

Food類:充當(dāng)抽象產(chǎn)品角色,具體產(chǎn)品的抽象類。任何具體產(chǎn)品都應(yīng)該繼承該類

TomatoScrambledEggs和ShreddedPorkWithPotatoes類:充當(dāng)具體產(chǎn)品角色,實(shí)現(xiàn)抽象產(chǎn)品類對(duì)定義的抽象方法,由具體工廠類創(chuàng)建,它們之間有一一對(duì)應(yīng)的關(guān)系。

四、.NET中實(shí)現(xiàn)了工廠方法的類

.NET 類庫(kù)中也有很多實(shí)現(xiàn)了工廠方法的類,例如asp.net中,處理程序?qū)ο笫蔷唧w用來(lái)處理請(qǐng)求,當(dāng)我們請(qǐng)求一個(gè)*.aspx的文件時(shí),此時(shí)會(huì)映射到System.Web.UI.PageHandlerFactory類上進(jìn)行處理,而對(duì)*.ashx的請(qǐng)求將映射到System.Web.UI.SimpleHandlerFactory類中(這兩個(gè)類都是繼承于IHttpHandlerFactory接口的),關(guān)于這點(diǎn)說(shuō)明我們可以在“C:/Windows/Microsoft.NET/Framework/v4.0.30319/Config/Web.Config”文件中找到相關(guān)定義,具體定義如下:

 <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中是如何實(shí)現(xiàn)的,如果對(duì)一個(gè)Index.aspx頁(yè)面發(fā)出請(qǐng)求時(shí),將會(huì)調(diào)用PageHandlerFactory中GetHandler方法來(lái)創(chuàng)建一個(gè)Index.aspx對(duì)象,它們之間的類圖關(guān)系如下:

五、總結(jié)

工廠方法模式通過(guò)面向?qū)ο缶幊讨械亩鄳B(tài)性來(lái)將對(duì)象的創(chuàng)建延遲到具體工廠中,從而解決了簡(jiǎn)單工廠模式中存在的問(wèn)題,也很好地符合了開放封閉原則(即對(duì)擴(kuò)展開發(fā),對(duì)修改封閉)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 色99久久| 黄色av.com| 国产精品久久久久久模特 | 欧美人一级淫片a免费播放 久久久久久久久91 国产99久久久久久免费看 | 性欧美在线视频 | 成人午夜视频在线观看免费 | 成人性视频免费网站下载软件 | 日本免费aaa观看 | 最新一区二区三区 | 亚洲国产午夜精品 | 国产免费一区二区三区网站免费 | 精品久久久久久久久久中文字幕 | 999插插插 | 成人在线视频在线观看 | 91精品国产综合久久婷婷香 | 免费a级黄色毛片 | 狠狠ri| 久久99精品国产99久久6男男 | 黄色片免费在线 | 91网在线播放 | 国产羞羞视频 | 九九爱视频 | 国产人成精品一区二区三 | 99在线在线视频免费视频观看 | 久久久久久亚洲综合影院红桃 | 九九精品在线播放 | 欧美成人福利 | 亚洲天堂中文字幕在线观看 | 国产精品久久久久久影院8一贰佰 | 久久久精品视频免费看 | 911网站大全在线观看 | 福利在线小视频 | 欧美一级精品 | 热久久91| 在线a视频 | 男女生羞羞视频网站在线观看 | 成人宗合网| 鲁丝片一区二区三区免费入口 | 国产一国产一级毛片视频在线 | 精品久久久久久久久久久久包黑料 | 国产乱淫a∨片免费观看 |