您好我想构建一个流畅的界面,用于创建某种工厂或构建器的对象。
我知道我必须“返回此”以使方法可链接。
public class CarBuilder
{
public CarBuilder()
{
car = new Car();
}
private Car car;
public CarBuilder AddEngine(IEngineBuilder engine)
{
car.Engine = engine.Engine();
return this;
}
public CarBuilder AddWheels(IWheelsBuilder wheels)
{
car.Wheels = wheels.Wheels();
return this;
}
public CarBuilder AddFrame(IFrameBuilder frame)
{
car.Frame = frame.Frame();
return this;
}
public Car BuildCar()
{
return car;
}
}
有了这个,我可以建造一辆这样的车:
Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(eBuilder).BuildCar();
但我需要的是一个特殊的序列或工作流程: 我只能在车架顶部制造车轮,当车轮存在时,我将能够建立发动机。 所以我没有提供汽车制造商的每一种方法,而是希望能够只将框架添加到构建器中,然后只将框架添加到框架中,然后将引擎添加到框架之上......
如果EngineBuilder本身具有流畅的api,如eBuilder.Cylinders(12).WithPistons()....
,它会是多么好或者什么是好的实现?是否有可能有这样的东西
Car c = builder.AddFrame(fBuilder).AddWheels(wBuilder).AddEngine(x=>x.WithCylinders(12).WithPistons()).BuildCar();
总结如何构建流畅界面的流程以及如何嵌套流畅的界面?
答案 0 :(得分:0)
那么AddWheels不是属于Frame的方法吗?您还可以考虑在请求无效操作时抛出异常,例如添加没有框架的轮子。
答案 1 :(得分:0)
不是只有一个暴露所有方法的CarBuilder类,而是有多个类,每个类只公开适用于" state"的方法。正在建造的汽车。
根据您的示例,CarBuilder
仅提供AddFrame
。 this
不返回AddFrame
,而是返回仅提供CarBuilderWithFrame
的类AddWheels
的对象,该对象返回仅提供{{1}的类CarBuilderWithFrameAndWheels
的对象}},返回仅提供AddEngine
的类CarBuilderWithEverything
的对象。
这个例子是非常连贯的,你可以争论是否有必要为这样一个线性过程完成这么多工作。
我喜欢的一个例子就是打印。 Printer对象可以返回提供三种方法的PrintJob对象:Cancel,Print或StartPage。 StartPage方法将返回一个Page对象,该对象为您提供所有绘图命令的方法,一个名为EndPage的绘图命令可以返回PrintJob对象。这样可以轻松地对简单的打印作业进行硬编码。
Build