San*_*G B 12 design-patterns builder template-method-pattern
模板模式在基类中提供算法,其步骤可以在派生类中进行修改.在Builder模式中,具体构建器公开了用于构建从Director类调用的产品的方法.
我知道使用这些模式的目的有所不同.模板模式是一种行为模式,它改变模板中的一个或多个步骤,而构建器模式是创建模式.
除了上述差异外,还有其他差异吗?
构建器模式中的director不是模板模式中的基本模板.具体的构建器在模板模式中的行为类似于可替换的步骤吗?
有人可以澄清一下.谢谢.
模板方法实际上只是定义每个子类必须定义的一些方法的一种方法.
构建器模式用于构造更复杂的对象.
让我们说我们想要构建不同的萨博(汽车品牌)模型.每个型号都有不同的发动机,灯等.
如果我们要使用模板方法模式,我们必须为每个单独的汽车组合创建一个类或使用一些讨厌的继承层次结构.很多这些方法也会包含重复的代码.
通过构建模式,我们可以采用不同的部件,将它们组合成一辆完整的汽车.因此,如果需要,我们可以为每个型号重复使用引擎,我们也可以自定义汽车的每个部分.
小智 7
我发现同样的问题非常有趣.
Saab汽车的例子很有意思,但它不符合"四人帮"(设计模式)中的Builder模式的描述.
我将使用"四人帮"术语.
在Gang of Four中,每次调用都不可能混合使用混凝土构造器,aDirector->Construct()所以萨博的例子,虽然很有趣,但并没有真正回答我的问题.
我看到一些:
导向器对象与构建器层次结构的分离是一个关键区别.在模板工厂中,体现广义流的方法和重写方法都是同一个类的成员.这使得Builder模式更好地封装了流程的内部阶段,因为如果只访问Director对象,客户端代码不太可能与这些方法联系.Builder模式还允许完全独立于Builder层次结构的装配过程的公式,允许在需要时更灵活地替换构建器实例.例如,一旦掌握了导演实例,您就可以轻松地构建产品的多个表示,每次动态替换混凝土构建器.因此,构建器更具动态性,更好地封装了混凝土构建器的内部工作方式.
此外,如果要通过继承详细说明Director对象,则可以在不增加层次结构的情况下执行此操作.例如,您可能有一个明确的构建过程,以便在最终构造之前节省时间 - 您可以继承Director对象,甚至可以在其上使用"Template Method"来通过继承对其进行自定义,而无需重新实现您的具体构建器.
但这导致我们考虑另一种与"模板工厂"密切相关的模式 - "策略"模式.
策略与模板工厂非常相似,有两个明显的区别:它将Context对象与Strategy层次结构分开,允许在运行时为单个问题实例切换算法.另一个不同之处在于,这些示例似乎表明,调用策略不一定涉及"模板方法"中的复杂或结构化过程.
但是我把它带到这里作为Builder的类比来达到另一个点 - 如果"策略"在其类结构中与Builder并行,那么"模板方法"的并行创建模式应该是"工厂方法".这很清楚,不仅仅是名称,而且有趣的是,本书的"工厂方法"和"模板方法"两章的讨论使用了几乎相同的例子(编辑文档的应用程序).
因此,在没有涉及创造和行为模式之间的区别的问题的情况下,我倾向于认为构建器和工厂方法基本上分别是策略和模板方法的特定情况和改进.
所以问题就变成了 - 如果你发现Builder和Template Factory没有区别 - 试着回答这些问题:
您更喜欢在系统的特定部分有什么视角?是"行为"还是"创造"?和
您是否需要强大的封装,或者动态替换或部署或调整构建器实例,或者您是否期望复杂性(通过继承,组合或其他方式)围绕创建过程或模板方法发展?如果任何这些问题的答案都与Builder/Strategy结构一致.否则,在XX Method模式中使用简单的关系或行为多态.