工厂模式以及反射机制
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 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;
}
}
}
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);
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;
}
}
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;
}
}