我发现同样的问题很有趣。
萨博汽车的例子很有趣,但它并没有遵循“四人帮”(Design Patterns)中Builder模式的描述。
我将使用“四人帮”术语。
在四人帮中,每次调用aDirector->Construct()
时都不能混合混凝土建造者,所以萨博的例子虽然很有趣,但并不能真正为我回答这个问题。
我看到一些:
从建设者层次导演对象的分离是一个关键的区别。在模板工厂中,体现广义流的方法和重写方法都是同一类的成员。这使得Builder模式更好地封装了流程的内部阶段,因为如果仅访问Director对象,客户端代码不太可能与此类方法联系。构建器模式还允许完全独立于构建器层次结构来制定组装过程,从而允许在需要时更灵活地替换构建器实例。例如,一旦掌握了导演实例,您就可以轻松构建产品的多个表示形式,每次都可以动态替换具体的制造商。所以建筑师更具活力,更好地包装了混凝土建筑商的内部运作。另外,如果你想通过继承来详细说明Director对象,你可以这样做,而不需要乘以你的层次结构。例如,为了在最终构建之前节省时间,您可能需要一个快速构建过程 - 您可以继承Director对象的子类,或者在其上自己使用“Template Method”来通过继承来定制它,而无需重新实现具体的构建器。
但是这导致我们考虑另一种与“模板工厂” - “策略”模式密切相关的模式。
策略与Template Factory非常相似,它有两个明显的区别:它将Context对象与策略层次结构分开,允许在运行时切换单个问题实例的算法。另一个区别是,这些例子似乎表明,调用策略并不一定涉及如“模板方法”中那样复杂或结构化的过程。
但我在此将其作为Builder的模拟器,以便达到另一点 - 如果“策略”与Builder的类结构平行,则“模板方法”的平行创建模式应为“工厂方法” 。这一点很清楚,不仅仅是名称,而且有趣的是,本书的“工厂方法”和“模板方法”两章的讨论几乎都使用相同的示例(编辑文档的应用程序)。
因此,我没有想到创建和行为模式之间有什么区别,我倾向于认为生成器和工厂方法分别基本上是特定案例和策略和模板方法的改进。
所以,问题就变成 - 如果你看到Builder和模板厂之间没有区别 - 尝试回答这些问题:
什么角度看,你更喜欢有对系统的特定部分?它是“行为”还是“创造”?和
您是否需要强大的封装,或一方面动态替换或部署或调整构建器实例,或者您希望复杂性(通过继承,组合或其他方式)围绕创建过程发展或模板方法?如果任何这些问题的答案都与Builder/Strategy结构一致。否则,在XX方法模式中使用关系或行为的简单多态性。
来源
2012-07-02 16:17:15
Ron
感谢jgauffin。一个问题与建筑工程中的导演如何工作有关。导演是不是有步骤按照特定的顺序创建对象。如果建筑商想要更改订单呢?我指的是这里提供的示例http://www.dofactory.com/Patterns/PatternBuilder.aspx#_self1 – 2011-04-15 11:26:10
那么。那么你打破了Liskovs替代原则,应该重新设计你的代码;) – jgauffin 2011-04-15 11:36:06