Rovan

      一个犁牛半块田,收也凭天,荒也凭天, 清茶淡饭饱三餐,早也香甜,晚也香甜, 布衣得暖胜丝绵,长也可穿,短也可穿, 草舍茅屋有几间,行也安然,待也安然, 雨过天青驾小船,鱼在一边,酒在一边, 夜归儿女话灯前,今也有言,古也有言, 日上三竿我独眠,请是神仙,我是神仙.

首页 新随笔 联系 订阅 管理
如前三种工厂模式:简单工厂,工厂方法和抽象工厂,所使用的编程技巧都是一般OOP语言所支持的,这里所谓的反射工厂,在设计思想上并没有特别的地方,但是对这三者的具体编程实现上,基于.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中不需要做任何的改动。
效果:使用反射技术的优点是极大地减少了工厂类的数量,降低了代码的冗余,并且系统更容易扩展,在增加新类型后,不需要修改工厂类.(这是由平台特点所决定的,不是由设计模式决定的).
使用反射技术的代价是工厂与产品之间的依赖关系不明显,由于是动态绑定,因此理论上可以用一个工厂完成很多类型的实例化,从而使代码不容易理解.另外增大了测试难度,创建是动态完成的,测试用例的编写和测试执行要比传统的工厂困难.
posted on 2006-08-01 16:15  Ruxuan  阅读(593)  评论(0)    收藏  举报