C# 为什么要使用生成器模式?

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

在大多数教程(Judith Bishops's book,or)中,我看到了与下面类似的示例

如果生成器模式意味着在执行一组生成器子操作的Director类中创建方法构造

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个步骤来构建某类组件:

  • 步骤A
  • 步骤B
  • 步骤C
  • 假设在某个时刻,另一个构件添加到族中,可以使用相同的步骤,但顺序不同:

  • 步骤A
  • 步骤C
  • 步骤B
  • 在这种情况下,如果序列的逻辑在Director中与基类生成器分离,则可以继承新的Director并使用它来构造。如果逻辑在Builder Builder中,基类可能是单独的库或JAR的一部分,或者是C++中的头文件,则可能需要重新编译具体的类或者至少发送一个新的jar。 我相信分离这样一个关注点会有更多的好处

    请看此视频:

    我不确定到目前为止是否使用了这种模式,但它的想法似乎是允许构建器独立于其定义来实现,因此允许存在任意数量的完全独立于使用它们的director类的不同构建器。@Radu:但director类并不独立于构建器:它在Construct的参数中使用Builder类。确实,它使用一个构建器,但它不必知道构建器是如何实现的。它只知道公共接口。同样地,构建器不需要知道使用它的类的细节,但是我们分离构造的目的是什么,为什么要创建Director类呢?当然,我们最近可以实现另一个生成器,Director也可以用同样的方式使用它。但是如果我们在每个子构建器中都继承了构造,那么我们可以用一种更简单的方法来做同样的事情(甚至更多),但是为什么要分离构建器逻辑呢?主管无法访问私人生成器成员,这使得代码更难理解。。。如果我不明白,很抱歉:你能提供一些澄清的例子吗?+1因为有时需要额外的重新编译可能是一个原因。但是,构建器模式的额外复杂性对我来说太高了。@JanTuroň这是你的选择和特权:)但我相信按照GoF有一个单独的控制器的原因就是我上面提到的。因此,如果这些构建器是可重用的对象,我们希望它们只在一个地方执行特定的操作集,它会使他们的代码与只使用一次的方法混淆,因此将这些操作分离到自定义类中更易于维护,这也是Director的目的。这将是构建器模式的一个很好的理由。我明白了吗?好吧,想象一下视频中的例子……假设我们正在构建一个地图,但是由于玩家没有更多的挖掘工具,游戏不会在地图上输出“资源”,因为用户无法访问它们。为什么要在每个构建器中设置是否向地图添加资源的逻辑,而该逻辑可以驻留在控制器中,控制器会告诉当前构建器是否输出资源。@arieljake:link不起作用。我知道它太老了,但仅供参考。