我发现同样的问题很有趣。
萨博汽车的例子很有趣,但它不符合“四人组”(设计模式)中对建造者模式的描述。
我将使用“四人帮”的术语。
在四人组中,每次调用aDirector->Construct() 都不能混合混凝土建造者,所以 Saab 的例子虽然很有趣,但对我来说并没有真正回答这个问题。
我看到了一些:
director 对象与构建器层次结构的分离是一个关键区别。在模板工厂中,体现通用流程的方法和被覆盖的方法都是同一类的成员。这使得 Builder 模式能够更好地封装流程的内部阶段,因为如果只访问 Director 对象,客户端代码就不太可能接触到这些方法。构建器模式还允许完全独立于构建器层次结构来制定组装过程,从而允许在需要时更灵活地替换构建器实例。例如,一旦您手头有一个 director 实例,您就可以轻松地构建产品的多个表示,每次都动态替换具体的构建器。因此构建器更加动态,更好地封装了具体构建器的内部工作。
此外,如果您想通过继承来详细说明 Director 对象,您可以这样做而无需增加您的层次结构。例如,您可能有一个明确的构建过程,以在最终构建之前节省时间 - 您可以对 Director 对象进行子类化,甚至在其本身上使用“模板方法”来通过继承对其进行自定义,而无需重新实现您的具体构建器。
但这导致我们考虑另一种与“模板工厂”密切相关的模式——“策略”模式。
策略与模板工厂非常相似,有两个明显的区别:它也将上下文对象与策略层次结构分开,允许在运行时为单个问题实例切换算法。另一个不同之处在于,这些示例似乎表明调用策略不一定涉及“模板方法”中的复杂或结构化过程。
但我把它带到这里是为了与 Builder 类似,以达到另一点 - 如果“策略”在其类结构中与 Builder 平行,那么与“模板方法”平行的创建模式应该是“工厂方法”。这一点很清楚,不仅是名称,而且有趣的是,本书的“工厂方法”和“模板方法”两章的讨论都使用了几乎相同的示例(用于编辑文档的应用程序)。
所以,不讨论创建模式和行为模式有什么区别,我倾向于认为 Builder 和 Factory Method 基本上分别是 Strategy 和 Template Method 的具体案例和改进。
所以问题变成了——如果你看不出 Builder 和 Template Factory 之间的区别——试着回答这些问题:
您更喜欢对系统的特定部分有什么看法?是“行为”还是“创造”?和
一方面,您是否需要强大的封装,或者构建器实例的动态替换、部署或调整,或者您是否期望复杂性(通过继承、组合或其他方式)围绕创建过程或模板方法?如果这些问题的答案与构建器/策略结构有关。否则,在 XX 方法模式中使用简单的关系或行为多态。