程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 應用設計形式中的工場辦法形式停止C#編程的示例講授

應用設計形式中的工場辦法形式停止C#編程的示例講授

編輯:C#入門知識

應用設計形式中的工場辦法形式停止C#編程的示例講授。本站提示廣大學習愛好者:(應用設計形式中的工場辦法形式停止C#編程的示例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是應用設計形式中的工場辦法形式停止C#編程的示例講授正文


簡介
工場辦法形式是甚麼?為何要有工場辦法形式,不是有了簡略工場形式了嗎?兩個形式都有工場,那有甚麼分歧呢?功工場方法形式是如何完成的?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圖:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810330646.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對象,它們之間的類圖關系以下:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810330654.png (933×433)

總結
工場辦法形式經由過程面向對象編程中的多態性來將對象的創立延遲到詳細工場中,從而處理了簡略工場形式中存在的成績,也很好地相符了開放關閉准繩(即對擴大開辟,對修正關閉)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved