利用設(shè)計(jì)模式可以使我們的代碼更靈活,更容易擴(kuò)展,更容易維護(hù)。各種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言都提供了基本相同的機(jī)制:比如類、繼承、派生、多態(tài)等等。但是又有各自的特色,C# 中的反射機(jī)制便是一個(gè)很重要的工具,好好地利用就可以在實(shí)際中發(fā)揮很大的作用。
我們來看一個(gè)例子:
我的程序中有需要一系列的對象,比如apple,orange…, 要想利用他們,我們就必須在程序中根據(jù)用戶要求,然后一個(gè)個(gè)調(diào)用 new 操作符來生成他們,這樣客戶程序就要知道相應(yīng)的類的信息,生成的代碼顯然不夠靈活。我們可以在代碼中不利用具體的類,而只是說明我們需要什么,然后就能夠得到我們想要的對象嗎?
哦,我們都看設(shè)計(jì)模式,聽吧,很多人都在那里鼓吹他們是如何如何的棒,我們看看怎么樣利用他們來解決問題。目標(biāo)明確了,那我們看看哪個(gè)能夠符合我們的要求。GoF的《設(shè)計(jì)模式》都看過吧,似懂非懂的看了一些,那我們看看能夠不能夠“湊”上去呢?J 嗯,我們的程序考慮的是對象怎么創(chuàng)建的,創(chuàng)建型模式應(yīng)該符合要求吧。然后我們?yōu)g覽一下各模式的“意圖”部分。呵呵,第一個(gè)好像就撞到彩了,抽象工廠,我們看看吧,“提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類”,至少“無需指定它們具體的類”符合我們的要求。來看看它的結(jié)構(gòu)吧:
我們的問題好像用不到這么復(fù)雜吧,只有orange,apple等等(應(yīng)該就是product了),他們顯然是一類的,都是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è)工廠呢?我們來寫下面的代碼:
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)行,然后在控制臺輸入想要的東西,呵呵,成功了。沉浸在幸福中的你得意忘形了吧。
我們來看一個(gè)例子:
我的程序中有需要一系列的對象,比如apple,orange…, 要想利用他們,我們就必須在程序中根據(jù)用戶要求,然后一個(gè)個(gè)調(diào)用 new 操作符來生成他們,這樣客戶程序就要知道相應(yīng)的類的信息,生成的代碼顯然不夠靈活。我們可以在代碼中不利用具體的類,而只是說明我們需要什么,然后就能夠得到我們想要的對象嗎?
哦,我們都看設(shè)計(jì)模式,聽吧,很多人都在那里鼓吹他們是如何如何的棒,我們看看怎么樣利用他們來解決問題。目標(biāo)明確了,那我們看看哪個(gè)能夠符合我們的要求。GoF的《設(shè)計(jì)模式》都看過吧,似懂非懂的看了一些,那我們看看能夠不能夠“湊”上去呢?J 嗯,我們的程序考慮的是對象怎么創(chuàng)建的,創(chuàng)建型模式應(yīng)該符合要求吧。然后我們?yōu)g覽一下各模式的“意圖”部分。呵呵,第一個(gè)好像就撞到彩了,抽象工廠,我們看看吧,“提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類”,至少“無需指定它們具體的類”符合我們的要求。來看看它的結(jié)構(gòu)吧:
我們的問題好像用不到這么復(fù)雜吧,只有orange,apple等等(應(yīng)該就是product了),他們顯然是一類的,都是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è)工廠呢?我們來寫下面的代碼:
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)行,然后在控制臺輸入想要的東西,呵呵,成功了。沉浸在幸福中的你得意忘形了吧。

