2

我正在为使用不同类型的部件(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;
    }
}

问题是我仍然必须传递所有属性,我认为这不遵循开放/封闭原则,我该怎么做才能解决这个问题?谢谢!

4

2 回答 2

3

您可以尝试使用与您提到的输入参数相对应的不同签名重载工厂方法。在这种情况下,只需实现两个具有相同名称的方法,它们具有足够且最少的参数集,它们返回不同类的对象。使用这种方法,您也可以删除“类型”

于 2013-05-18T18:29:32.307 回答
1

您可以使用抽象工厂而不是工厂方法来做到这一点。您的抽象工厂将创建零件。然后,您为要创建的每个部件创建从抽象工厂派生的具体工厂。这样,您可以放弃类型检查,因为每个具体工厂只知道它的一部分。您几乎可以通过从 PartFactory 继承来实现这一点。

这种方法的唯一问题是不同的部分需要不同的数据来构建。这在抽象的 Create() 方法后面是不可能的。它可以在具体工厂的构造函数中处理,但这意味着您在工厂的生命周期内都坚持使用这些值。

于 2013-05-18T19:59:47.957 回答