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

首頁 > 編程 > C# > 正文

使用設計模式中的工廠方法模式進行C#編程的示例講解

2020-01-24 01:16:27
字體:
來源:轉載
供稿:網友

簡介
工廠方法模式是什么?為什么要有工廠方法模式,不是有了簡單工廠模式了嗎?兩個模式都有工廠,那有什么不同呢?功工廠方式模式是怎樣實現的?OK,帶著這些問題,繼續看下面文章。

工廠方法模式是對簡單工廠模式的擴展,可以說是用來完善簡單工廠模式的缺點的,什么缺點呢?在上一篇文章已經說過:擴展性極差。你想一下,如果在簡單工廠模式中,如果董事會決定想添加一個玩具生產,叫熊貓玩具,那么全廠該做的事有哪些呢?
1.告訴銷售經理:我們準備要添加一個熊貓玩具,可以提供給用戶的。
2.到工廠作坊里面,告訴工人要做熊貓工具。
在現實生活中確實是這樣的,因為在現實生活中這樣做不會造成很大的影響,但是在程序世界里面就大件事了,首先如果這樣做可能會破壞工廠作坊的內部結構,造成BUG,還有的是這樣改就等于修改了源代碼,不斷添加新的工具,不斷修改源代碼,有沒想過:如果添加100個玩具,那個判斷命令里面得有多少個case?。?,程序里面不同現實生活,創建新的大工廠是不用錢的。。所以要用好這個特點,下面我們就對上篇文章中的玩具廠進行一次大規模的改造,讓其實現工程方法模式?。。。?!

是不是很激動,,我也很激動。。。

首先,玩具工廠原址變成指揮站,專門指揮新工廠的建立的,然后指揮站附近新建三個小型工廠:玩具貓工作廠,玩具狗工作廠,玩具熊貓工作廠。各自的工作坊只會做各自的玩具。指揮戰中有玩具的生產計劃書,每個小型工廠都需要按照指揮部的工作計劃書來做玩具(當然計劃書只要求了一部分特色功能,各個廠的小玩具到底怎么做,,還要自己做的)。好了,就這么簡單,全新的工廠開發模式出來了,這樣做的好處是什么呢?我們看一下如果新提供鱷魚玩具到底該做什么:
1.新建一個小型工廠(鱷魚工廠)
2.去問指揮部那一份制作計劃書,讓鱷魚有計劃書中的基本功能(這樣才能通過考核然后上線出售)
2.鱷魚工廠自己購買鱷魚的制作指南去制作鱷魚玩具。

現在是不是發現,如果給程序干這事,簡直就是,,,超級簡單,不會擾亂其他工廠的生產秩序。當有客戶來買玩具的時候,他們到指揮站說:我要一只小狗,指揮站說:給錢后請到哪里哪里拿(小狗工廠),然后客戶走過去拿就是了。

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

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圖:

2016217142103490.png (834×328)

從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對象,它們之間的類圖關系如下:

2016217142153566.png (933×433)

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品无码久久久久久国产| 91综合免费在线| 久久久精品久久久| 亚洲影视九九影院在线观看| 日韩一区二区三区在线播放| 亚洲伊人成综合成人网| 国产精品99久久久久久久久| 97超碰蝌蚪网人人做人人爽| 爽爽爽爽爽爽爽成人免费观看| 欧美极品少妇xxxxⅹ免费视频| 国产日韩专区在线| 一区二区三区www| 精品国产91乱高清在线观看| 亚洲性线免费观看视频成熟| 黄色精品在线看| 日韩亚洲精品电影| 国产日韩在线看片| 精品调教chinesegay| 欧美激情中文字幕乱码免费| 亚洲三级免费看| 九色精品免费永久在线| 亚洲国产免费av| 亚洲欧美日韩第一区| 国产一区二中文字幕在线看| 在线看日韩av| 奇米成人av国产一区二区三区| 深夜福利国产精品| 91av视频在线免费观看| 一区二区三区视频在线| 中文字幕国内精品| 伊人久久久久久久久久久久久| 蜜臀久久99精品久久久久久宅男| 欧美一级淫片videoshd| 亚洲网站在线观看| 91chinesevideo永久地址| 九九视频这里只有精品| 91视频九色网站| 久久国产天堂福利天堂| 成人信息集中地欧美| 国产精品久久9| 欧美不卡视频一区发布| 日韩欧美国产高清91| 欧美日韩国产一中文字不卡| 国产不卡av在线| 91av在线播放视频| 欧美午夜精品在线| 中文字幕日韩欧美| 最好看的2019年中文视频| 日本午夜在线亚洲.国产| 成人精品久久久| 国产欧美日韩视频| 97视频在线观看免费高清完整版在线观看| 日韩专区在线播放| 欧美巨乳在线观看| 97精品久久久| 国产在线拍偷自揄拍精品| 日本欧美黄网站| 久久久久亚洲精品| 久久艹在线视频| 国产激情久久久| 日韩在线观看成人| 色老头一区二区三区在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 欧美极品少妇xxxxⅹ裸体艺术| 8x海外华人永久免费日韩内陆视频| 亚洲综合精品一区二区| 国产精品视频自在线| 中国china体内裑精亚洲片| 欧美大奶子在线| 精品久久中文字幕| 日本成人激情视频| 日韩欧美aaa| 亚洲片国产一区一级在线观看| 91精品国产综合久久久久久久久| 亚洲高清福利视频| 中文字幕在线视频日韩| 九九热这里只有精品免费看| 精品福利在线看| 久久久在线免费观看| 国产精品视频成人| 欧美日本高清一区| 91精品视频播放| 77777少妇光屁股久久一区| 国产精品视频yy9099| 亚洲欧美中文日韩v在线观看| 成人网页在线免费观看| 日韩视频欧美视频| 久久色在线播放| 久久久亚洲精品视频| 国产在线精品一区免费香蕉| 久久天天躁狠狠躁夜夜爽蜜月| 911国产网站尤物在线观看| 成人免费网站在线看| 久久精品视频播放| 欧美电影在线观看网站| 日韩欧美在线视频免费观看| 精品亚洲男同gayvideo网站| 人九九综合九九宗合| 日韩欧美在线播放| 国产精品夜间视频香蕉| 精品久久久久久久中文字幕| 亚洲一区二区国产| 久久久久久中文| 欧美电影免费观看高清| 国产精品日韩在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲国产精品久久| 亚洲福利视频免费观看| 精品久久久久久久久久ntr影视| 国产成人精品视频在线观看| 日韩视频―中文字幕| 国产91ⅴ在线精品免费观看| 欧美日本高清视频| 成人做爰www免费看视频网站| 亚洲欧美日本伦理| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧洲xxxx| 亚洲激情视频在线| 色偷偷偷综合中文字幕;dd| 成人黄色免费在线观看| 中文字幕久热精品视频在线| 日韩精品在线观看网站| 欧美亚洲成人xxx| 久久久中精品2020中文| 国产精品青草久久久久福利99| 亚洲深夜福利在线| 尤物yw午夜国产精品视频| 久久99视频精品| 91高清免费视频| 国产欧美日韩精品在线观看| 怡红院精品视频| 亚洲精美色品网站| 欧美性生交xxxxxdddd| 久操成人在线视频| 91久久精品国产91久久性色| 亚洲毛片在线看| 欧美成人精品h版在线观看| 欧美日韩视频免费播放| 俺去啦;欧美日韩| 日韩电影大片中文字幕| 日韩中文字幕第一页| 亚洲91精品在线观看| 中文字幕在线精品| 91麻豆桃色免费看| 午夜精品一区二区三区在线视频| 欧美大尺度在线观看| 日韩中文字幕网址| 日韩精品在线免费| 红桃视频成人在线观看| 久久久国产精品一区| 久久久精品在线观看| www.99久久热国产日韩欧美.com| 亚洲乱码av中文一区二区| 第一福利永久视频精品| 2019中文字幕在线免费观看| 91国语精品自产拍在线观看性色| 一区二区三区视频免费| 久久人人爽国产| 国产成人一区三区| 亚洲人成自拍网站| 欧洲成人性视频| 2018日韩中文字幕| 欧美孕妇性xx| 国产乱肥老妇国产一区二|