Design patterns 当生成的产品需要不同的输入时,如何使用生成器模式
假设我想为ModernCar和FlintstonesCar创建生成器,但它们需要不同的材质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之间创
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)
。在这种情况下,生成器模式仍然适用吗?