反射工厂

这里所谓的反射工厂,在设计思想上并没有特别的地方,但是对这三者的具体编程实现上,基于.NET平台的特点,有了新的变化,使简化了这三种工厂模式,如下示例使用反射技术改善简单工厂模式的例子:
// 对简单工厂的改进
namespace  ReflectionFactory_DesignPattern
{
    
using  System;
    
using  System.Reflection;

    
// 基类是交通工具Vehicle类
     public   abstract   class  Vehicle
    {
        
public   abstract   string  Go();
    }
    
// 这里,由Vehicle类派生出2个子类
     public   class  Car : Vehicle
    {
        
public   override   string  Go()
        {
            
return   " 汽车飞驰 " ;
        }
    }
    
public   class  Boat : Vehicle
    {
        
public   override   string  Go()
        {
            
return   " 轮船排水 " ;
        }
    }

    
// 仔细看这里的代码,利用了.NET平台的反射技术,使简单工厂类的设计更简约和可扩展
     public   class  VehicleSimpleFactory
    {
        
public   static  Vehicle Create( string  typename)
        {
            
// 获取传递进来的类名的类型(包含名称空间,如myspace.myclass),区分大小写,找不到时,抛出异常
            Type type  =  Type.GetType(typename,  true );
            
object  objInstance  =  Activator.CreateInstance(type);
            
return  (Vehicle)objInstance;
        }
    }
    
// 这里,我我们扩展一个由Vehicle派生的新的子类:Train时,我们不需要对VehicleSimpleFactory类
    
// 内部的Create方法做修改,这就是使用反射技术的好处了
     public   class  Train : Vehicle
    {
        
public   override   string  Go()
        {
            
return   " 火车冒烟 " ;
        }
    }
    
class  Client
    {
        
static   void  Main()
        {
            Vehicle v 
=  VehicleSimpleFactory.Create( " ReflectionFactory_DesignPattern.Boat " );
            Console.WriteLine( v.Go());
            v 
=  VehicleSimpleFactory.Create( " ReflectionFactory_DesignPattern.Car " );
            Console.WriteLine(v.Go());
            
// 扩展的Train类使用
            v  =  VehicleSimpleFactory.Create( " ReflectionFactory_DesignPattern.Train " );
            Console.WriteLine(v.Go());
            Console.Read();
        }
    }
}
// 在简单工厂模式中使用反射技术的好处是显而易见的,我们在扩展Vehicle的子类时,在Vehicle的工厂类
// VehicleSimpleFactory中不需要做任何的改动。
效果:使用反射技术的优点是极大地减少了工厂类的数量,降低了代码的冗余,并且系统更容易扩展,在增加新类型后,不需要修改工厂类.(这是由平台特点所决定的,不是由设计模式决定的).
使用反射技术的代价是工厂与产品之间的依赖关系不明显,由于是动态绑定,因此理论上可以用一个工厂完成很多类型的实例化,从而使代码不容易理解.另外增大了测试难度,创建是动态完成的,测试用例的编写和测试执行要比传统的工厂困难.
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值