.NET的反射工厂

    技术2022-05-11  90

    .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));

       }

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

     

     

     

     

     

     

     

     

     

     

    最新回复(0)