最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年02月17日 14:24:09   作者:LearningHard  
這篇文章主要介紹了使用設(shè)計模式中的工廠方法模式進行C#編程的示例講解,工廠方法模式可以看作是對簡單工廠模式的進一步擴展,需要的朋友可以參考下

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

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

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

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

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

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

namespace 設(shè)計模式之工廠方法模式

{
  /// <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>
    /// 負責創(chuàng)建西紅柿炒蛋這道菜
    /// </summary>
    /// <returns></returns>
    public override Food CreateFoddFactory()
    {
      return new TomatoScrambledEggs();
    }
  }
  /// <summary>
  /// 土豆肉絲工廠類
  /// </summary>
  public class ShreddedPorkWithPotatoesFactory:Creator
  {
    /// <summary>
    /// 負責創(chuàng)建土豆肉絲這道菜
    /// </summary>
    /// <returns></returns>
    public override Food CreateFoddFactory()
    {
      return new ShreddedPorkWithPotatoes();
    }
  }
  /// <summary>
  /// 客戶端調(diào)用
  /// </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();
    }
  }
}

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

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

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

2016217142103490.png (834×328)

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

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

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

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

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

.NET中實現(xiàn)了工廠方法的類
.NET 類庫中也有很多實現(xiàn)了工廠方法的類,例如Asp.net中,處理程序?qū)ο笫蔷唧w用來處理請求,當我們請求一個*.aspx的文件時,此時會映射到System.Web.UI.PageHandlerFactory類上進行處理,而對*.ashx的請求將映射到System.Web.UI.SimpleHandlerFactory類中(這兩個類都是繼承于IHttpHandlerFactory接口的),關(guān)于這點說明我們可以在“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中是如何實現(xiàn)的,如果對一個Index.aspx頁面發(fā)出請求時,將會調(diào)用PageHandlerFactory中GetHandler方法來創(chuàng)建一個Index.aspx對象,它們之間的類圖關(guān)系如下:

2016217142153566.png (933×433)

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

相關(guān)文章

  • C#中Invoke的用法講解

    C#中Invoke的用法講解

    這篇文章主要介紹了C#中Invoke的用法講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • MVC設(shè)定默認路由為指定的Area下的某個action

    MVC設(shè)定默認路由為指定的Area下的某個action

    今天小編就為大家分享一篇關(guān)于MVC設(shè)定默認路由為指定的Area下的某個action,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C#實現(xiàn)移除字符串末尾指定字符的方法

    C#實現(xiàn)移除字符串末尾指定字符的方法

    這篇文章主要介紹了C#實現(xiàn)移除字符串末尾指定字符的方法,十分常見且重要的一個應(yīng)用技巧,需要的朋友可以參考下
    2014-08-08
  • C#Process的OutputDataReceived事件不觸發(fā)問題及解決

    C#Process的OutputDataReceived事件不觸發(fā)問題及解決

    這篇文章主要介紹了C#Process的OutputDataReceived事件不觸發(fā)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#中的委托delegate用法的示例詳解

    C#中的委托delegate用法的示例詳解

    這篇文章主要介紹了C#中的委托用法的示例詳解。本章將由淺入深地講述什么是委托、為什么要使用委托、事件的由來、.NET Framework 中的委托和事件、委托中方法異常和超時的處理、委托與異步編程、委托和事件對Observer 設(shè)計模式的意義。感興趣的可以了解一下
    2020-07-07
  • Unity實現(xiàn)刮獎效果

    Unity實現(xiàn)刮獎效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)刮獎效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 分享一個C#編寫簡單的聊天程序(詳細介紹)

    分享一個C#編寫簡單的聊天程序(詳細介紹)

    這是一篇基于Socket進行網(wǎng)絡(luò)編程的入門文章,我對于網(wǎng)絡(luò)編程的學習并不夠深入,這篇文章是對于自己知識的一個鞏固,同時希望能為初學的朋友提供一點參考。文章大體分為四個部分:程序的分析與設(shè)計、C#網(wǎng)絡(luò)編程基礎(chǔ)(篇外篇)、聊天程序的實現(xiàn)模式、程序?qū)崿F(xiàn)
    2015-12-12
  • C#獲取web.config配置文件內(nèi)容的方法

    C#獲取web.config配置文件內(nèi)容的方法

    這篇文章主要介紹了C#獲取web.config配置文件內(nèi)容的方法,涉及C#配置文件屬性獲取的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#中委托用法實例分析

    C#中委托用法實例分析

    這篇文章主要介紹了C#中委托用法,較為詳細的分析了C#中委托的概念與相關(guān)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • c#中object、var和dynamic的區(qū)別小結(jié)

    c#中object、var和dynamic的區(qū)別小結(jié)

    這篇文章主要給大家介紹了關(guān)于c#中object、var和dynamic的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論

渭南市| 铅山县| 德格县| 三门峡市| 固镇县| 涪陵区| 天气| 翁源县| 双城市| 务川| 八宿县| 江孜县| 禹城市| 太和县| 中阳县| 从化市| 吴桥县| 德江县| 塔城市| 日照市| 浦县| 沁源县| 井陉县| 崇信县| 万年县| 石首市| 三河市| 长葛市| 肃北| 竹溪县| 颍上县| 荔浦县| 怀远县| 嘉善县| 临海市| 微山县| 呼和浩特市| 崇文区| 常熟市| 丘北县| 滁州市|