利用設計模式可以使我們的代碼更靈活,更容易擴展,更容易維護。各種面向對象的程序設計語言都提供了基本相同的機制:比如類、繼承、派生、多態等等。但是又有各自的特色,C# 中的反射機制便是一個很重要的工具,好好地利用就可以在實際中發揮很大的作用。
我們來看一個例子:
我的程序中有需要一系列的對象,比如apple,orange…, 要想利用他們,我們就必須在程序中根據用戶要求,然後一個個調用 new 操作符來生成他們,這樣客戶程序就要知道相應的類的信息,生成的代碼顯然不夠靈活。我們可以在代碼中不利用具體的類,而只是說明我們需要什麼,然後就能夠得到我們想要的對象嗎?
我們都看設計模式,很多人都在那裡鼓吹他們是如何如何的棒,我們看看怎麼樣利用他們來解決問題。目標明確了,那我們看看哪個能夠符合我們的要求。《設計模式》似懂非懂的看了一些,那我們看看能夠不能夠“湊”上去呢?嗯,我們的程序考慮的是對象怎麼創建的,創建型模式應該符合要求吧。然後我們浏覽一下各模式的“意圖”部分。第一個好像就撞到彩了,抽象工廠,我們看看吧,“提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類”,至少“無需指定它們具體的類”符合我們的要求。來看看它的結構吧:
我們的問題好像用不到這麼復雜吧,只有orange,apple等等(應該就是product了),他們顯然是一類的,都是fruit,我們只要一個生產水果的工廠就可以,左邊的繼承層次不要,只有一個FruitFactroy看看行不,先別管它正統不正統,實用就行。
下面的一些東西顯然是我們需要的:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">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; }
編譯運行,然後在控制台輸入想要的東西,呵呵,成功了。沉浸在幸福中的你得意忘形了吧。
——部分材料整理於網絡文章