使用参数更正Factory方法的实现

时间:2013-05-18 18:12:26

标签: c# design-patterns factory

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您可以使用抽象工厂而非工厂方法执行此操作。您的抽象工厂将创建零件。然后,您可以为要创建的每个零件创建从抽象工厂派生的具体工厂。这样,您可以删除类型检查,因为每个具体工厂只知道它的部分。通过继承PartFactory,你几乎得到了这个。

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