C#反射和抽象工廠的結合

讀了這篇文章對C#的反射機制和抽象工廠的概念有了一些瞭解,本人認爲是一篇好文章。

以下文字轉載自http://blog.csdn.net/zhlyyea/archive/2008/02/23/2114654.aspx

 

我的程序中有需要一系列的對象,比如apple,orange…, 要想利用他們,我們就必須在程序中根據用戶要求,然後一個個調用 new 操作符來生成他們,這樣客戶程序就要知道相應的類的信息,生成的代碼顯然不夠靈活。我們可以在代碼中不利用具體的類,而只是說明我們需要什麼,然後就能夠得到我們想要的對象嗎?
 
  哦,我們都看設計模式,聽吧,很多人都在那裏鼓吹他們是如何如何的棒,我們看看怎麼樣利用他們來解決問題。目標明確了,那我們看看哪個能夠符合我們的要求。GoF的《設計模式》都看過吧,似懂非懂的看了一些,那我們看看能夠不能夠“湊”上去呢?J 嗯,我們的程序考慮的是對象怎麼創建的,創建型模式應該符合要求吧。然後我們瀏覽一下各模式的“意圖”部分。呵呵,第一個好像就撞到彩了,抽象工廠,我們看看吧,“提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類”,至少“無需指定它們具體的類”符合我們的要求。
 
  我們的問題好像用不到這麼複雜,只有orange,apple等等(應該就是product了),他們顯然是一類的,都是fruit,我們只要一個生產水果的工廠就可以,左邊的繼承層次不要,只有一個FruitFactroy看看行不,先別管它正統不正統,實用就行。
  下面的一些東西顯然是我們需要的:
 

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

  編譯運行,然後在控制檯輸入想要的東西,呵呵,成功了。沉浸在幸福中的你得意忘形了吧。
不過等等,它好像還不完美,我如果想要pear,我既要在客戶代碼中的switch中加入判斷,又要在工廠方法中加入MakePear方法,好像不怎麼優雅。更好一點,在工廠中只提供一個方法,MakeFruit,然後傳遞進一個參數Name,代表我們想要的水果的名稱,這樣的話,似乎我們的客戶代碼中的那個switch就可以不要了,相反,在FruitFactory中好像需要一個,還等什麼呢?實現吧。

 

  這樣看起來好多了,至少我客戶代碼中不要再寫那麼一長串的判斷代碼了。
 
  既然不要條件判斷,傳入的只有水果的名稱,假如Name = “Apple”,要生成一個Apple的對象,我需要new Apple(),如果我能夠這樣多好: new MakeItToClass(Name),把字符串轉換成一個類。C#中雖然沒有上述語法,但是提供了相應的機制,那就是反射。其中一個重要的類就是System.Type類,它對於反射起着核心的作用。我們可以使用 Type 對象的方法、字段、屬性和嵌套類來查找有關該類型的所有信息。
 
  另外一個重要的類就是System.Activator,它包含特定的方法,用以在本地或從遠程創建對象類型,或獲取對現有遠程對象的引用。
 
  我們可以先利用Type類獲取Name指定的類名的類的Type信息,然後可以根據這個信息利用Activator創建對象。還等什麼呢?

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

發佈了73 篇原創文章 · 獲贊 5 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章