我熟悉这些模式,但仍然不知道如何处理以下情况:
public class CarFactory
{
public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
{
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return new Car1(Dep1,Dep2,Dep3);
break;
case B:
return new Car2(Dep4,Dep5,Dep6);
break;
}
}
}
一般来说,问题在于需要注入的引用数量。当有更多的汽车时,情况会变得更糟。
我想到的第一种方法是在工厂构造函数中注入Car1和Car2,但这与工厂模式相悖,因为工厂将始终返回相同的对象。第二种方法是注入servicelocator,但这是反模式。如何解决?
编辑:
替代方法1:
public class CarFactory
{
public CarFactory(IContainer container)
{
_container = container;
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return _container.Resolve<ICar1>();
break;
case B:
return _container.Resolve<ICar2>();
break;
}
}
}
另一种方式2(因为树中存在太多的依赖关系而难以使用):
public class CarFactory
{
public CarFactory()
{
}
public ICar CreateCar(type)
{
switch(type)
{
case A:
return new Car1(new Dep1(),new Dep2(new Dep683(),new Dep684()),....)
break;
case B:
return new Car2(new Dep4(),new Dep5(new Dep777(),new Dep684()),....)
break;
}
}
}
type
作为输入,并返回你所需的三个Dep#
。然后,你可以将所有依赖项映射到映射类的实例中,在引导程序中注入映射实例到工厂中。 - Anders