我正在为一个用不同类型的零件(C#)构建机器人的程序提供解决方案。 在这种情况下,我有两种类型共享一些属性,两种类型的部分都继承自抽象类Part。
到目前为止,我从界面窗口中的实际按钮代码调用new,就像这样。
if (type == acuatic)
Part pieceA = new AcuaticPart(type,name,price,maxDepth);
else
Part pieceB = new TerrestrialPart(type,name,price,terrain,maxTemp);
我知道这是完全错误的设计,我应该实现工厂方法。问题是我不知道将所有参数发送到工厂是否可以,如下所示:
在界面窗口中:
Part piece = _partFactory.CreatePart(type,name,price,maxDepth,terrain,maxTemp);
在具体工厂:
public class ConcretePartFactory : PartFactory
{
public override Part CreatePart(type,name,price,maxDepth,terrain,maxTemp)
{
Part myPart = default(Part);
switch (type)
{
case "actuatic":
myPart = new AquaticPart(type,name,price,maxDepth);
break;
case "terrestrial":
myPart = new TerrestrialPart(type,name,price,terrain,maxTemp);
break;
}
return myPart;
}
}
问题是我仍然需要传递所有属性,我认为这不符合开放/封闭原则,我该怎么做才能解决这个问题?谢谢!
答案 0 :(得分:3)
您可以尝试使用与您提到的输入参数对应的不同签名重载工厂方法。在这种情况下,只需实现两个具有相同名称的方法,这些方法具有足够和最小的参数集,这些参数返回不同类的对象。使用这种方法,您也可以删除“类型”
答案 1 :(得分:1)
您可以使用抽象工厂而非工厂方法执行此操作。您的抽象工厂将创建零件。然后,您可以为要创建的每个零件创建从抽象工厂派生的具体工厂。这样,您可以删除类型检查,因为每个具体工厂只知道它的部分。通过继承PartFactory,你几乎得到了这个。
这种方法的唯一问题是不同的部件需要不同的数据用于构造。这在抽象的Create()方法背后是不可能的。它可以在具体工厂的构造函数中处理,但这意味着你可以在工厂的生命周期中坚持使用这些值。