C# 为什么要使用生成器模式?
在大多数教程(Judith Bishops's book,or)中,我看到了与下面类似的示例 如果生成器模式意味着在执行一组生成器子操作的Director类中创建方法构造C# 为什么要使用生成器模式?,c#,design-patterns,C#,Design Patterns,在大多数教程(Judith Bishops's book,or)中,我看到了与下面类似的示例 如果生成器模式意味着在执行一组生成器子操作的Director类中创建方法构造 class Director { public static void Construct(Builder builder) { builder.BuildPartA(); builder.BuildPartB(); ... } } abstract class Builder { pub
class Director {
public static void Construct(Builder builder) {
builder.BuildPartA();
builder.BuildPartB();
...
}
}
abstract class Builder {
public abstract void BuildPartA();
public abstract void BuildPartB();
...
}
class Builder1 : Builder { ... }
class Builder2 : Builder { ... }
void Main() {
Builder1 b1 = new Builder1();
Builder2 b2 = new Builder2();
Director.Construct(b1);
Director.Construct(b2);
}
…我们为什么不把构造方法移到Builder类中呢
class Builder {
public virtual void BuildPartA();
public virtual void BuildPartB();
public void Construct() {
BuildPartA();
BuildPartB();
...
}
...
}
class Builder1 : Builder { ... }
class Builder2 : Builder { ... }
void Main() {
Builder1 b1 = new Builder1();
Builder2 b2 = new Builder2();
b1.Construct();
b2.Construct();
}
请给我展示一些生成器模式真正有用的示例。目录应该知道组装不同组件以构建对象的正确顺序。我相信这仅仅是将了解构建这些对象的顺序或方法与基本构建器类(它只是一个基类)分离开来。如果将构造移动到生成器库中,它将类似于模板方法模式 最好有一个知道如何组装组件的独立控制器,因为即使构建组件的“配方”发生变化,基类也不需要改变。例如,假设需要通过按特定顺序执行3个步骤来构建某类组件:
我不确定到目前为止是否使用了这种模式,但它的想法似乎是允许构建器独立于其定义来实现,因此允许存在任意数量的完全独立于使用它们的director类的不同构建器。@Radu:但director类并不独立于构建器:它在Construct的参数中使用Builder类。确实,它使用一个构建器,但它不必知道构建器是如何实现的。它只知道公共接口。同样地,构建器不需要知道使用它的类的细节,但是我们分离构造的目的是什么,为什么要创建Director类呢?当然,我们最近可以实现另一个生成器,Director也可以用同样的方式使用它。但是如果我们在每个子构建器中都继承了构造,那么我们可以用一种更简单的方法来做同样的事情(甚至更多),但是为什么要分离构建器逻辑呢?主管无法访问私人生成器成员,这使得代码更难理解。。。如果我不明白,很抱歉:你能提供一些澄清的例子吗?+1因为有时需要额外的重新编译可能是一个原因。但是,构建器模式的额外复杂性对我来说太高了。@JanTuroň这是你的选择和特权:)但我相信按照GoF有一个单独的控制器的原因就是我上面提到的。因此,如果这些构建器是可重用的对象,我们希望它们只在一个地方执行特定的操作集,它会使他们的代码与只使用一次的方法混淆,因此将这些操作分离到自定义类中更易于维护,这也是Director的目的。这将是构建器模式的一个很好的理由。我明白了吗?好吧,想象一下视频中的例子……假设我们正在构建一个地图,但是由于玩家没有更多的挖掘工具,游戏不会在地图上输出“资源”,因为用户无法访问它们。为什么要在每个构建器中设置是否向地图添加资源的逻辑,而该逻辑可以驻留在控制器中,控制器会告诉当前构建器是否输出资源。@arieljake:link不起作用。我知道它太老了,但仅供参考。