激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - 使用設計模式中的工廠方法模式進行C#編程的示例講解

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

2021-11-12 15:15LearningHard C#

這篇文章主要介紹了使用設計模式中的工廠方法模式進行C#編程的示例講解,工廠方法模式可以看作是對簡單工廠模式的進一步擴展,需要的朋友可以參考下

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

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

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

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

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

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

namespace 設計模式之工廠方法模式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
{
  /// <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語句)。具體代碼為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/// <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圖:

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

從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”文件中找到相關定義,具體定義如下:

?
1
2
3
4
5
<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對象,它們之間的類圖關系如下:

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

 

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

延伸 · 閱讀

精彩推薦
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
主站蜘蛛池模板: 欧美成人做爰高潮片免费视频 | 欧美一级黄色录像片 | 亚洲免费在线视频 | 成人毛片网 | 在线中文资源免费 | 国产亚洲高清视频 | 欧美一极视频 | 免费视频a| 欧美日韩免费一区二区三区 | 嫩草影院在线观看网站成人 | 九九热视频免费 | 久久人人爽人人爽人人片av高清 | 麻豆一区二区99久久久久 | 国产69精品久久久久久 | 国产精品久久久久久久不卡 | 欧美一级无毛 | 久久国产在线观看 | 久久国产经典 | 久久久久久久久久久综合 | 成人免费福利视频 | 激情小说图 | 国产免费一区二区三区最新不卡 | 黄色网址免费在线播放 | av成人免费 | 久久亚洲春色中文字幕久久 | 久久骚 | 国产精品1区2区在线观看 | 国产一级免费av | 亚洲精品动漫在线观看 | 欧美视频在线观看一区 | 亚洲视频在线视频 | 羞羞视频免费观看网站 | 国产精品久久久久久久久久10秀 | 免费久久久| 国产精品久久久久久久午夜片 | 精品影视一区二区 | 久久久久久久爱 | av在线不卡免费 | 电视剧全部免费观看 | 免费人成在线观看网站 | 欧美亚洲黄色 |