一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C# - 使用設(shè)計(jì)模式中的工廠方法模式進(jìn)行C#編程的示例講解

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

2021-11-12 15:15LearningHard C#

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

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

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

是不是很激動(dòng),,我也很激動(dòng)。。。

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

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

工廠方法模式的實(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)):

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

?
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
  {
    // 輸出點(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();
    }
  }
}

使用工廠方法實(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ǔ)句)。具體代碼為:

?
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>
  /// 肉末茄子工廠類,負(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();
    }
  }

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

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

從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)定義,具體定義如下:

?
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中是如何實(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)系如下:

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

 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产视频一区 | 色哟哟观看 | 久久亚洲一级α片 | 网站色小妹 | 欧美yw193.c㎝在线观看 | 国产肥臀 | 国产免费一区二区三区 | 白丝女榨干蹂躏我 | 苍井空50分钟无码 | 亚洲视频免费 | 青青青国产成人久久111网站 | 69热视频| 日本最大的黄色网站 | 福利一区二区在线观看 | 欧美聚众性派对hdsex | xxx黑人又大粗又长 xxxx性欧美极品另类 | 91亚洲精品第一综合不卡播放 | 精品国产福利在线观看一区 | 久久精品观看影院2828 | 久久婷婷五月综合色丁香 | 91进入蜜桃臀在线播放 | 日本三级欧美三级人妇英文 | 欧美亚洲国产精品久久久 | 都市后宫小说 | 天天舔天天操天天干 | 人阁色第四影院在线观看 | 日韩精品特黄毛片免费看 | 91麻豆国产福利精品 | 娇小8一12xxxx第一次 | chinese高中生gay男同 | 我要看靠逼片 | 国模孕妇季玥全部人体写真 | 色亚洲视频| 好大好硬抽搐好爽想要 | 暖暖免费高清完整版观看日本 | 久久内在线视频精品mp4 | 色老板在线播放 | 2022国产麻豆剧传媒古装 | 公共场合高h短篇 | 欧美一区二区三区不卡视频 | 色老头oldmoneyvideos |