工厂模式以及反射机制

利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护。

在以前,程序中如果需要一系列的对象,我们就必须使用一系列的类和 new 操作符来一个个地生成他们。在生成这些对象之前必须先要知道相应的类的信息。

而抽象工厂模式是,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

下面就以一个水果工厂(FruitFactory)为例加以说明:

首先要有一个抽象的水果(接口):

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!"); 
}
}

最后我们再创建一个水果工厂:

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

在水果工厂(FruitFactory)中,只要输入一个水果名称(Name),就会返回一个相应的水果对象:

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

以上水果工厂(FruitFactory)的工作原理就是,根据输入的水果名称,经过条件判断(switch),返回相应的水果对象。

如果水果工厂(FruitFactory)只要知道水果的名称(Name),而无须经过条件判断(switch),就能返回相应的水果对象,那就好了。

在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;
}
}
posted on 2007-04-16 11:50  今日花园  阅读(340)  评论(0)    收藏  举报