工厂模式以及反射机制
利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护。
在以前,程序中如果需要一系列的对象,我们就必须使用一系列的类和 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 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;
}
}

浙公网安备 33010602011771号