我认为这段代码受到了致命的伤害,但在采取新的方法之前,我想提出一些意见。通用接口的工厂方法
我正在为以下接口编写工厂方法。
public interface ITransformer<I, O>
{
O Transform(I input);
}
这里是一个可能实现的接口
public class CarToTruckTransformer : ITransformer<Car, Truck>
{
public Truck Transform(Car input)
{
Truck output = new Truck();
output.Seats = input.Seats - 2;
output.BedSize = input.TrunkSize;
output.Gunrack = true;
return output;
}
}
第一家工厂我确实是这样的
static class TransformerFactory
{
public static ITransformer<I, O> GetTransformer<I, O>()
{
if (typeof(I) == typeof(Car) && typeof(O) == typeof(Truck))
{
return (ITransformer<I, O>)new CarToTruckTransformer();
}
else
{
return null;
}
}
}
,但我必须知道确切的类型时,我给工厂方法,所以它似乎不理想。
ITransformer<Car, Truck> transf = TransformerFactory.GetTransformer<Car, Truck>();
我也玩弄了以下内容,但恐怕这可能是对动态关键字的严重滥用。
public class TransformerFactory2
{
public static dynamic GetTransformer(VehicleBase input, VehicleBase output)
{
if (input.GetType() == typeof(Car) && output.GetType() == typeof(Truck))
{
return (ITransformer<Car, Truck>)new CarToTruckTransformer();
}
else
{
return null;
}
}
}
但它确实允许我得到我想要的工厂语法。
dynamic transf = TransformerFactory2.GetTransformer(car, truck);
我也考虑过第一个选项,但用反射调用工厂方法,所以我可以动态地分配类型变量。最终,我希望整个“变换”过程被包含在一个可重用的方法中,并在需要时实现新的变换器,但我还没有。
这种情况有没有更好或更安全的方法?
感谢您的阅读。
这是最好通过像Ninject这样的依赖注入库解决的问题。这些库允许您轻松地将具体实现绑定到接口,然后工厂可以在执行时轻松获得正确的实现。 – 2011-03-30 20:31:46