<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>

            C#抽象工廠模式的幾種實現方法及比較

            時間:2025-09-02 08:05:34 C語言

            C#抽象工廠模式的幾種實現方法及比較

              利用設計模式可以使我們的代碼更靈活,更容易擴展,更容易維護。各種面向對象的程序設計語言都提供了基本相同的機制:比如類、繼承、派生、多態等等。但是又有各自的特色,C# 中的反射機制便是一個很重要的工具,好好地利用就可以在實際中發揮很大的作用。 下面就和小編一起看看C#抽象工廠模式的幾種實現方法及比較吧。

            C#抽象工廠模式的幾種實現方法及比較

              我們來看一個例子:

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

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

              我們的問題好像用不到這么復雜吧,只有orange,apple等等(應該就是product了),他們顯然是一類的,都是fruit,我們只要一個生產水果的工廠就可以,左邊的繼承層次不要,只有一個FruitFactroy看看行不,先別管它正統不正統,實用就行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應該是怎么樣呢?上面的結構圖中它給的是CreateProductA,那好,我就MakeOrange,還有一個CreateProductB,俺MakeOrange還不行??

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

              怎么使用這個工廠呢?我們來寫下面的代碼:

            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; 
                   }

              編譯運行,然后在控制臺輸入想要的東西,呵呵,成功了。沉浸在幸福中的你得意忘形了吧。

              不過等等,它好像還不完美,我如果想要pear,我既要在客戶代碼中的switch中加入判斷,又要在工廠方法中加入MakePear方法,好像不怎么優雅。更好一點,在工廠中只提供一個方法,MakeFruit,然后傳遞進一個參數Name,代表我們想要的水果的名稱,這樣的話,似乎我們的客戶代碼中的那個switch就可以不要了,相反,在FruitFactory中好像需要一個,還等什么呢?實現吧。

            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);

              這樣看起來好多了,至少我客戶代碼中不要再寫那么一長串的判斷代碼了。

              阿Q精神又在起作用,我們又沉浸在成功的喜悅中了。 嗯,代碼好像可以,應該沒有什么改進了。但是好像又有另外一個聲音在說:

              “除了一點……”

              “嗯? 等等,什么?”

              “FruitFactory也有switch啊,看起來也ugly啊!”

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

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

              另外一個重要的類就是System.Activator,它包含特定的方法,用以在本地或從遠程創建對象類型,或獲取對現有遠程對象的引用。

              我們可以先利用Type類獲取Name指定的類名的類的Type信息,然后可以根據這個信息利用Activator創建對象。還等什么呢?

            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; 
                     } 
                   }

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

            【C#抽象工廠模式的幾種實現方法及比較】相關文章:

            KMP算法的C#實現方法07-22

            c#實現sunday算法實例10-12

            c#實現輪詢算法實例代碼10-01

            Java開發策略模式的簡單應用實現方法01-20

            php中抽象類與抽象方法的用法08-14

            快速排序算法及C#版的實現示例12-06

            Java抽象類和接口的比較01-22

            C#實現協同過濾算法的實例代碼10-01

            java設計模式:工廠模式10-04

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院