【发布时间】:2017-01-22 03:03:02
【问题描述】:
我有如下代码
public interface ICar
{
void Created();
}
public class BigCar : ICar
{
public void Created()
{
}
}
public class SmallCar : ICar
{
public void Created()
{
}
}
public class LuxaryCar : ICar
{
public void Created()
{
}
}
public class CarFactory
{
public ICar CreateCar(int carType)
{
switch (carType)
{
case 0:
return new BigCar();
case 1:
return new SmallCar();
case 2:
return new LuxaryCar();
default:
break;
}
return null;
}
}
在这段代码中,我有一个返回具体实例的工厂。但是每次我需要有一个新的 ICar 接口实现时,我都必须更改 CarFactory 的 CreateCar() 方法。看来我不支持 SOLID 原则的开放封闭原则。请建议是否有更好的方法来处理这种情况。
【问题讨论】:
-
您不应该将
carType传递给CreateCar方法。相反,工厂本身将决定它创建的汽车类型。您将为每种想要支持的汽车类型创建不同的工厂。 -
@Vlad 这意味着 switch 语句将移动到您决定使用哪个工厂的某个地方。恕我直言,OP 正在询问如何完全消除 switch 语句。即使您在调用站点创建工厂,您也需要以某种方式将
carType转换为工厂。 -
您应该使用一些包含类型名称和程序集的配置文件来查找要创建的与键关联的类型。然后您可以在您的工厂中使用
Activator.CreateInstance来表示该类型。 -
@HimBromBeere,这无济于事,因为对于每个新的
ICar,都必须有一个新密钥,对于每个新密钥,工厂中都必须有一个新的case。你又回到了第一格。 -
@GoodNightNerdPride 不完全是。在这种情况下,您不需要任何开关,您所做的只是调用
Activator.CreateInstance(Type.GetType(typeFromConfig)),也许您必须将程序集添加到加载上下文中,但这就是一切。switch没用。
标签: c# oop design-patterns solid-principles