日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開(kāi)發(fā)C#.NET → C#抽象工廠模式實(shí)現(xiàn)方法

      C#抽象工廠模式實(shí)現(xiàn)方法

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/11/15 15:19:20字體大。A-A+

      作者:佚名點(diǎn)擊:33次評(píng)論:0次標(biāo)簽: C#

      API精靈FOR c#v2.35 最新版
      • 類(lèi)型:編程輔助大小:324KB語(yǔ)言:中文 評(píng)分:7.5
      • 標(biāo)簽:
      立即下載
       利用設(shè)計(jì)模式可以使我們的代碼更靈活,更容易擴(kuò)展,更容易維護(hù)。各種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言都提供了基本相同的機(jī)制:比如類(lèi)、繼承、派生、多態(tài)等等。但是又有各自的特色,C# 中的反射機(jī)制便是一個(gè)很重要的工具,好好地利用就可以在實(shí)際中發(fā)揮很大的作用。

         我們來(lái)看一個(gè)例子:

         我的程序中有需要一系列的對(duì)象,比如apple,orange…, 要想利用他們,我們就必須在程序中根據(jù)用戶要求,然后一個(gè)個(gè)調(diào)用 new 操作符來(lái)生成他們,這樣客戶程序就要知道相應(yīng)的類(lèi)的信息,生成的代碼顯然不夠靈活。我們可以在代碼中不利用具體的類(lèi),而只是說(shuō)明我們需要什么,然后就能夠得到我們想要的對(duì)象嗎?

         哦,我們都看設(shè)計(jì)模式,聽(tīng)吧,很多人都在那里鼓吹他們是如何如何的棒,我們看看怎么樣利用他們來(lái)解決問(wèn)題。目標(biāo)明確了,那我們看看哪個(gè)能夠符合我們的要求。GoF的《設(shè)計(jì)模式》都看過(guò)吧,似懂非懂的看了一些,那我們看看能夠不能夠“湊”上去呢?J 嗯,我們的程序考慮的是對(duì)象怎么創(chuàng)建的,創(chuàng)建型模式應(yīng)該符合要求吧。然后我們?yōu)g覽一下各模式的“意圖”部分。呵呵,第一個(gè)好像就撞到彩了,抽象工廠,我們看看吧,“提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)”,至少“無(wú)需指定它們具體的類(lèi)”符合我們的要求。來(lái)看看它的結(jié)構(gòu)吧:



         我們的問(wèn)題好像用不到這么復(fù)雜吧,只有orange,apple等等(應(yīng)該就是product了),他們顯然是一類(lèi)的,都是fruit,我們只要一個(gè)生產(chǎn)水果的工廠就可以,左邊的繼承層次不要,只有一個(gè)FruitFactroy看看行不,先別管它正統(tǒng)不正統(tǒng),實(shí)用就行J

         下面的一些東西顯然是我們需要的:

      Public interface IFruit
      {
      }

      public class Orange:IFruit
      {
        public Orange()
        {
         Console.WriteLine("An orange is got!");
        }
      }

      public class Apple:IFruit
      {
        public Apple()
        {
         Console.WriteLine("An apple is got!");
        }
      }

         我們的FruitFactory應(yīng)該是怎么樣呢?上面的結(jié)構(gòu)圖中它給的是CreateProductA,那好,我就MakeOrange,還有一個(gè)CreateProductB,俺MakeOrange還不行??

      public class FruitFactory
      {
        public Orange MakeOrange()
        {
         return new Orange();
        }
        public Apple MakeApple()
        {
         return new Apple();
        }
      }

         怎么使用這個(gè)工廠呢?我們來(lái)寫(xiě)下面的代碼:

      string FruitName = Console.ReadLine();
      IFruit MyFruit = null;
      FruitFactory MyFruitFactory = new FruitFactory();

      switch (FruitName)
      {
        case "Orange":
         MyFruit = MyFruitFactory.MakeOrange();
         break;
        case "Apple":
         MyFruit = MyFruitFactory.MakeApple();
         break;
        default:
         break;
      }

         編譯運(yùn)行,然后在控制臺(tái)輸入想要的東西,呵呵,成功了。沉浸在幸福中的你得意忘形了吧。
         不過(guò)等等,它好像還不完美,我如果想要pear,我既要在客戶代碼中的switch中加入判斷,又要在工廠方法中加入MakePear方法,好像不怎么優(yōu)雅。更好一點(diǎn),在工廠中只提供一個(gè)方法,MakeFruit,然后傳遞進(jìn)一個(gè)參數(shù)Name,代表我們想要的水果的名稱,這樣的話,似乎我們的客戶代碼中的那個(gè)switch就可以不要了,相反,在FruitFactory中好像需要一個(gè),還等什么呢?實(shí)現(xiàn)吧。

      FruitFactory:
      public class FruitFactory
      {
        public IFruit MakeFruit(string Name)
        {
         switch (Name)
         {
          case "Orange":
           return new Orange();
          case "Apple":
           return new Apple();
          default:
           return null;
         }
        }
      }

         客戶代碼:

      string FruitName = Console.ReadLine();
      IFruit MyFruit;
      FruitFactory MyFruitFactory = new FruitFactory();
      MyFruit = MyFruitFactory.MakeFruit(FruitName);

         這樣看起來(lái)好多了,至少我客戶代碼中不要再寫(xiě)那么一長(zhǎng)串的判斷代碼了。

         阿Q精神又在起作用,我們又沉浸在成功的喜悅中了。 嗯,代碼好像可以,應(yīng)該沒(méi)有什么改進(jìn)了。但是好像又有另外一個(gè)聲音在說(shuō):

         “除了一點(diǎn)……”

         “嗯? 等等,什么?”

         “FruitFactory也有switch啊,看起來(lái)也ugly啊!”

         “哼,肯定是看《重構(gòu)》或者是《TDD》了,怎么要求那么苛刻!反正閑著也是閑著,看看可以改不?”

         既然不要條件判斷,傳入的只有水果的名稱,假如Name = “Apple”,要生成一個(gè)Apple的對(duì)象,我需要new Apple(),如果我能夠這樣多好: new MakeItToClass(Name),把字符串轉(zhuǎn)換成一個(gè)類(lèi)。C#中雖然沒(méi)有上述語(yǔ)法,但是提供了相應(yīng)的機(jī)制,那就是反射。其中一個(gè)重要的類(lèi)就是System.Type類(lèi),它對(duì)于反射起著核心的作用。我們可以使用 Type 對(duì)象的方法、字段、屬性和嵌套類(lèi)來(lái)查找有關(guān)該類(lèi)型的所有信息。

         另外一個(gè)重要的類(lèi)就是System.Activator,它包含特定的方法,用以在本地或從遠(yuǎn)程創(chuàng)建對(duì)象類(lèi)型,或獲取對(duì)現(xiàn)有遠(yuǎn)程對(duì)象的引用。

         我們可以先利用Type類(lèi)獲取Name指定的類(lèi)名的類(lèi)的Type信息,然后可以根據(jù)這個(gè)信息利用Activator創(chuàng)建對(duì)象。還等什么呢?

      public class FruitFactory
      {
        public IFruit MakeFruit(string Name)
        {
         IFruit MyFruit = null;
         try
         {
          Type type = Type.GetType(Name,true);
          MyFruit = (IFruit)Activator.CreateInstance(type);
         }
         catch (TypeLoadException e)
          Console.WriteLine("I dont know this kind of fruit,exception caught - {0}" ,e.Message);
          return MyFruit;
        }
      }

         經(jīng)過(guò)這樣的處理以后,增加新的水果的時(shí)候,我們不需要修改客戶代碼了,同時(shí)工廠的代碼也不需要修改了,怎么樣,爽吧!

       

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門(mén)評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)