.NET的反射工厂

.NET的反射工厂
引言
假设我们要创建一种交通工具,可以是汽车或者火车。结构如下图所示:

 
 
 
   
我们可以采用简单工厂,通过参数指定创建所需要的对象类型。但是,这样的缺点是:如果增加子类,例如卡车和轿车等,则必须增加参数和相应的代码。如果子类层次很多,则会使程序变得难以维护。如果用简单工厂实现上面的结构,则显然很烦琐。
当然我们也可以用工厂方法来实现,即定义一个产生交通工具的接口,在子类中实现创建具体交通工具。代码如下:

///<summary>

    ///创建交通工具接口

    ///</summary>

    public interface CreateVehicle

    {

       BaseVehicle CreateVehicle();

}

 
 
 
 

    ///<summary>

    ///创建汽车。

    ///</summary>

    public class CreateCar : CreateVehicle

    {

       public CreateCar() {}

      

       #region CreateVehicle 成员

 
 
 
 

       public BaseVehicle CreateVehicle()

       {

           return new Car();

       }

 
 
 
 

       #endregion

    }

这就是工厂方法,但是采用这种方法还是有缺点:如果我们希望增加一个新的交通工具,不仅需要继承交通工具基类,还需要实现产生交通工具的工厂方法。显然,如果我们需要10种交通工具,则需要10个具体的工厂类,而这些类的区别仅仅是返回对应类的实例,所以为维护带来了麻烦。在这个场合下,工厂方法和简单工厂没有区别。

采用反射技术简化工厂类

有没有可能将需要创建类的类型传递到工厂方法中,由工厂方法根据类型返回对应的实例?

解决这个问题的关键是需要动态决定需要创建的类,这不是设计模式能解决的问题,属于软件平台的功能范畴。.NET可以提供相应的功能,即反射技术。

我们来看看用反射技术实现的工厂类:

    ///<summary>

    ///交通工具工厂类

    ///</summary>

    public class VehicleFactory

    {

       public static BaseVehicle Create(System.Type vehicleType)

       {

           BaseVehicle vehicle = null;

           System.Reflection.ConstructorInfo constructor = vehicleType.GetConstructor(System.Type.EmptyTypes);

           try

           {

              vehicle = constructor.Invoke(null) as BaseVehicle;

              return vehicle;

           }

           catch

           {

              throw;

           }

       }

}

 
 
 
 

在使用时,只需要传入需要创建的类的类型即可:

static void Main(string[] args)

       {

           BaseVehicle car = VehicleFactory.Create(typeof(Car));

           BaseVehicle truck = VehicleFactory.Create(typeof(Truck));

   }

使用反射技术,我们在新增类型时不需要新的工厂类,这样,我们得到了简化的工厂,可以将其称之为“反射工厂”。
 

 

 

 

 

 

 

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值