工厂模式以及反射机制

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;
}
}
原文地址:https://www.cnblogs.com/kkkblog/p/3530812.html