gpt4 book ai didi

oop - 生成器模式 : Why does the Director construct the object?

转载 作者:行者123 更新时间:2023-12-04 13:14:02 27 4
gpt4 key购买 nike

我正在学习 Builder Pattern

在上面的链接(Java 示例)中,我注意到 Builder 提供了构造多个组件的接口(interface)。除了调用它们,我们还调用了 getProduct()。

我不明白的一点是,为什么Director需要一个一个调用所有这些组件构造方法并最终得到结果。

     /** "Director" */
class Waiter {
private PizzaBuilder pizzaBuilder;


public void setPizzaBuilder(PizzaBuilder pb) { pizzaBuilder = pb; }
public Pizza getPizza() { return pizzaBuilder.getPizza(); }

public void constructPizza() {
pizzaBuilder.createNewPizzaProduct();
pizzaBuilder.buildDough(); // construct component 1
pizzaBuilder.buildSauce(); // construct component 2
pizzaBuilder.buildTopping(); // construct component 3
}

}

为什么我们不将构造组件1、2、3的代码包含在它自己的ConcreteBuilder类中而不是Director中,实际上消除了Director层。

我知道上述方法可能会将 Builder 模式转变为其他模式,但我不明白为什么 Director 会一步一步地完成这项工作。有什么好处?如果有多个导演,就会有重复的代码,对吧?我可能不理解执行构建器模式背后的动机......

更新 :构建器模式是否专注于在创建更大的复杂对象时提供可定制的组件选择?否则,到目前为止,我认为引入一个额外的层,Director 没有意义。

即使是这样,装饰器模式也可能是一个更好的主意,通过动态自定义组件来完成同样的任务。在某个地方我错过了 Builder 背后的要点.. :(

最佳答案

Director 类的目的是封装创建对象的算法,即将构造逻辑的代码与实际构成对象的部分的代码分开。如果没有 Director 类,您的 Builder 类将更加庞大且模块化程度更低,因此更难以维护且可重用性更低。

Wikipedia example你说的比较简单。对于复杂的对象,构造机制通常要复杂得多,Director 不一定要按照定义的顺序逐一调用 Builder 方法。例如,考虑 Cake类:它可能有部分 ChocolateLayer , CreamLayerStrawberry . Builder 将定义三种方法来按此特定顺序构建这三个部分,但是 constructCake() Director 类中的方法可能如下所示:

public void constructCake() {
CakeBuilder.createNewCakeProduct();
CakeBuilder.buildChocolateLayer();
CakeBuilder.buildCreamLayer();
CakeBuilder.buildChocolateLayer(); // 2nd call of the same Builder method
int totalStrawberries = 3 + new Random().nextInt(2);
for (int i = 1; i <= totalStrawberries; i++)
CakeBuilder.buildStrawberry(); // put some strawberries on top
// Please don't try this recipe at home!
}

至于Builder和Decorator的区别,可以查看 Builder Vs Decorator pattern问题。

关于oop - 生成器模式 : Why does the Director construct the object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15307044/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com