【问题标题】:StringBuilder and Builder PatternStringBuilder 和 Builder 模式
【发布时间】:2011-03-08 20:34:08
【问题描述】:

我是设计模式的新手,所以我有一个关于构建器模式的问题。 今天听说Builder Pattern 和Java、C# 中的StringBuilder 类不同。我知道构建器模式的主要目标是通过几个步骤创建复杂的对象......我认为这是用它的方法 Append 制作StringBuilder......所以我很难找到区别......

你能告诉我真的有什么不同吗?如果是……那是什么:)?

【问题讨论】:

标签: design-patterns builder stringbuilder


【解决方案1】:

听起来您可能混淆了 StringBuilder 类和 Builder 设计模式。它们实际上是两种截然不同的想法。

StringBuilderJava.NET 中的一个类,它允许更高性能的字符串操作:(来自 MSDN)

String 对象是不可变的。每一个 您使用其中一种方法的时间 System.String 类,你新建一个 内存中的字符串对象,其中 需要重新分配空间 那个新对象。在以下情况下 你需要重复执行 对字符串的修改, 与创建一个相关的开销 新的 String 对象可能代价高昂。这 System.Text.StringBuilder 类可以 当你想修改一个字符串时使用 无需创建新对象。为了 例如,使用 StringBuilder 类 可以提高性能时 将许多字符串连接在一起 一个循环。

另一方面,Builder Pattern 是一种设计模式,它是一组用于组织复杂代码的类和/或接口:

建造者模式是一个软件 设计模式。目的是 抽象的构建步骤 对象,使不同 这些步骤的实现可以 构造不同的表示 对象。通常,建造者模式是 用于按照 对于复合模式,结构 模式。

StringBuilderAppend 方法只是在现有字符串中添加更多字符。没有创建新对象(builder 模式 的基本功能),也没有涉及设计模式。这是对单个对象实例的单个方法调用。

【讨论】:

  • 您能否引用任何参考资料,说明当我们使用 Builder 模式时,会在中途创建新对象?或者我把你的陈述弄错了。请澄清。
  • @gauravjain 在构建器模式中,这一切都取决于您正在构建的内容的实现。取决于程序员。字符串构建器已经是构建器模式的实现,并且专门设计用于不创建中间对象以使字符串连接更快。在 String builder 类中查找 MsDN 文档,您应该会在第一段或第二段中看到它的拼写。
  • Hey Paul,我认为你说的不对,在 Builder 模式下和 StringBuilder 的实现存在不同的想法。这么说听起来像模式只有一种实现(或一种类型的实现),它消除了所有设计的灵活性模式。我认为 StringBuilder 与 Bloch 的 Builder 一样有效的 Builder 实现。两者都是分步构建对象,分步构建的目的是不可变对象还是性能优化没有区别。
【解决方案2】:
  1. 不同的目的。字符串生成器有助于字符串构造,生成器模式将对象的构造与其表示分离。
  2. 不同的结构。 String Builder 有两个协作者,Builder 模式有四个协作者。

ad 1) String 的创建没有抽象。例如,树结构是抽象的,可以用对象表示,也可以用 XML 文件表示(实现)。

ad 2) 使用StringBuilder 对象时,有两个协作者:

  1. Client
  2. StringBuilder

使用Builder Pattern时,有四个合作者:

  1. Director - 它告诉Abstract Builder 的构造步骤是什么(如果是树结构,步骤是:创建根,添加子...)
  2. Abstract Builder - 是Director 使用的抽象。
  3. Concrete Builder - 是 Abstract Builder 的具体实现(可能是 XMLBuilder、ObjectBuilder...)
  4. Client - 告诉Director 开始构建。

【讨论】:

  • +1 在以这种方式讨论对象及其交互时,我喜欢合作者的想法。你总是听说客户端代码、客户端/服务器关系,但合作者,这对我来说是新的。你会碰巧有一个链接到一篇可以扩展这个想法的文章吗?谢谢!
【解决方案3】:

分析文档,我可以说 StringBuilder 没有使用相应的模式。它使用Composite pattern。构建器模式不会“手动逐步”或循环收集对象。它有现成的解决方案。

【讨论】:

  • 我不认为它真的符合Composite Pattern 的描述,因为它符合模式——我不知道名称——拥有一对关联的不可变和可变类,这样不可变对象的状态可以复制到可变对象,可变对象的状态可以复制到新的不可变对象。然后代码可以有效地操作一个非共享的可变对象以产生一些所需的状态,然后要求它产生一个封装相同状态的可共享的不可变对象。
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多