C# 带参数工厂法的校正实现

C# 带参数工厂法的校正实现,c#,design-patterns,factory,C#,Design Patterns,Factory,我正在为一个用不同类型的零件(C#)制造机器人的程序做一个解决方案。 在本例中,我有两种类型共享一些属性,两种类型的部件都继承自抽象类部件 直到现在,我一直在从界面窗口中的实际按钮代码调用new,它是这样的 if (type == acuatic) Part pieceA = new AcuaticPart(type,name,price,maxDepth); else Part pieceB = new TerrestrialPart(type,name,price,terrain,m

我正在为一个用不同类型的零件(C#)制造机器人的程序做一个解决方案。 在本例中,我有两种类型共享一些属性,两种类型的部件都继承自抽象类部件

直到现在,我一直在从界面窗口中的实际按钮代码调用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;
    }
}

问题是我仍然必须传递所有属性,我认为这没有遵循打开/关闭原则,我能做些什么来解决这个问题?谢谢

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

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

您可以使用抽象工厂而不是工厂方法来完成此操作。您的抽象工厂将创建零件。然后为要创建的每个零件创建从抽象工厂派生的具体工厂。通过这种方式,您可以放弃类型检查,因为每个混凝土工厂只知道其部分。通过从PartFactory继承,您几乎实现了这一点


这种方法的唯一问题是,不同的部分需要不同的数据块进行构建。这在抽象Create()方法后面是不可能的。它可以在具体工厂的构造函数中处理,但这意味着,在工厂的生命周期中,您可以使用抽象工厂而不是工厂方法。您的抽象工厂将创建零件。然后为要创建的每个零件创建从抽象工厂派生的具体工厂。通过这种方式,您可以放弃类型检查,因为每个混凝土工厂只知道其部分。通过从PartFactory继承,您几乎实现了这一点

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

assign myPart=default(myPart)应该在case语句的默认值中。assign myPart=default(myPart)应该在case语句的默认值中。