Design patterns 当生成的产品需要不同的输入时,如何使用生成器模式

Design patterns 当生成的产品需要不同的输入时,如何使用生成器模式,design-patterns,architecture,Design Patterns,Architecture,假设我想为ModernCar和FlintstonesCar创建生成器,但它们需要不同的材质 class ModernCarBuilder { BuildEngine(Steel); BuildDoor(Steel); BuildTire(Rubber); } class FlintstonesCarBuilder { BuildEngine(Wood); BuildDoor(Wood); BuildTire(Stone); } 我如何在2之间创

假设我想为ModernCarFlintstonesCar创建生成器,但它们需要不同的材质

class ModernCarBuilder
{
    BuildEngine(Steel);
    BuildDoor(Steel);
    BuildTire(Rubber);
}

class FlintstonesCarBuilder
{
    BuildEngine(Wood);
    BuildDoor(Wood);
    BuildTire(Stone);
}
我如何在2之间创建一个公共接口

我能想到的一种方法如下,但对我来说似乎是反模式的

class ModernCarBuilder
{
    ModernCarBuilder(Steel, Rubber); // constructor
    BuildEngine();
    BuildDoor();
    BuildTire();
}

class FlintstonesCarBuilder
{
    FlintstonesCarBuilder(Wood, Stone);
    BuildEngine();
    BuildDoor();
    BuildTire();
}

您可以从为建筑商建造汽车所需的通用合同(方法)创建界面开始。然后创建一个依赖于原始材料的基类

public interface IMaterial
{
}

public interface ICarBuilder
{
    void BuildEngine();
    void BuildDoor();
    void BuildTire();
}

public abstract class CarBuilder :ICarBuilder
{
    public CarBuilder(IMaterial material1, IMaterial materia2)
    {
    }

    public abstract void BuildDoor();
    public abstract void BuildEngine();
    public abstract void BuildTire();
}
现在,您可以将IMaterial实现到实际的原材料类中

public class Steel : IMaterial
{   
}
public class Rubber : IMaterial
{
}
对于特定类型的汽车制造商,您现在可以实现类
CarBuilder

public class ModernCarBuilder : CarBuilder
{
    public ModernCarBuilder(Steel steel, Rubber rubber) : base(steel, rubber)
    {
    }

    public override void BuildDoor()
    {
        throw new NotImplementedException();
    }

    public override void BuildEngine()
    {
        throw new NotImplementedException();
    }

    public override void BuildTire()
    {
        throw new NotImplementedException();
    }
}
类似于多种类型的汽车制造商。现在,您可以通过公共基类引用调用任何特定类型的CarBuilder

//e.g. 
CarBuilder m = new ModernCarBuilder(new Steel(), new Rubber());
m.BuildDoor();

非常感谢。我面临的主要问题是,我无法找到材料的通用界面。假设ModernCar采用字符串作为输入
ModernCar(字符串)
,而FlintstonesCar采用整数
FlintstonesCar(int)
。在这种情况下,生成器模式仍然适用吗?