【问题标题】:disadvantages of builder design pattern [closed]构建器设计模式的缺点
【发布时间】:2011-02-19 05:20:48
【问题描述】:

使用构建器设计模式有什么缺点。有吗??

edit - 我想知道使用构建器设计模式是否有任何不良后果?正如在 GOF 书中,他们提到了设计模式的好坏结果。但是他们没有提到构建器设计模式的任何不良后果。

【问题讨论】:

  • 没有上下文就无法回答这个问题。你想用建造者模式解决什么问题?构建器模式是解决静态类型语言中某些问题的一种方法,但不能用于解决同一语言中的其他问题,因此无法说它是“好”还是“坏”。
  • 视情况而定。如果您的类看起来将具有多个参数的构造函数,那么构建器设计模式将是一个不错的选择。但是,如果您设计的课程的唯一目的是将字符串“Trousers”打印到屏幕上,那么它可能有点矫枉过正......

标签: java oop design-patterns builder


【解决方案1】:

它确实会在 DTO 中创建更多的代码(并且可能会引入更多的复杂性),而不是使用构造函数参数和/或 setter/getter。

在我看来这没什么大不了的,在大多数情况下并没有太多额外的代码。如果您的对象具有一些强制参数和一些可选参数,那么构建器模式将非常值得。

【讨论】:

  • 旧线程,但是我看不出为什么强制或可选应该是一个参数来决定你应该使用这个还是那个方法来获取数据集。早在人们编写纯 C/C++ 代码的时代,我们还没有这一切。我想我们知道我们在做什么。事情自然会发展,但对我来说,构建器模式会使你的类变得混乱,工作量更大,使代码更难阅读,并且确实增加了维护。我见过它,它以 Builder 开头,然后是 Constructor 和 setter。他们三个。而这一切都是因为有人写了一本名为 Effective Java 的书。
  • 强制 + 可选是有效 java 中显示的构建器模式的一个特性,因此需要考虑。当然,如果你需要不变性。有人,有时确实滥用它的论点真的很糟糕。如果需要,您可以使用公共字段,它的代码要少得多。
【解决方案2】:

仅当模式被滥用/误用时,该模式才是不利的。 IE。该模式根本没有解决/适合实际的技术/功能问题。然后,您应该寻找另一种模式来解决特定问题。

这并不特别适用于构建器模式,而是一般的设计模式。


更新:如果您有兴趣了解各种设计模式(特别是 GoF 设计模式书中提到的那些)和 Java API 中的真实示例,那么您可能会发现这个答案:Examples of GoF Design Patterns in Java's core libraries 有用。它包含指向详细解释这些模式的 Wikipedia 文章的链接。

【讨论】:

    【解决方案3】:

    我第二个 Jarle 的 post

    另外,说到缺点:

    • 如果您必须使用 Hibernate 或 JAXB 映射 DTO,则构建器模式不适合。
    • 如果您出于某些原因想要一个可变对象。
    • 对于具有两个或三个字段的小型 DTO,这只是开销,您应该使用一两个构造函数。除非您知道/相信 DTO 将来会包含更多字段。

    【讨论】:

    • -1,所有 3 点都是错误的。构建器模式与数据库映射绝对无关,是否可变,您的第三点表明您实际上并不知道构建器模式的目的是什么。
    • @Angel:映射框架通常使用 set 方法和构造函数来为对象设置不同的值。您以前使用过通用映射框架吗?您的最后两个论点相当薄弱。
    • 映射框架中使用的“setMethods”或“constructors”与构建器模式有什么关系?正确:nothing 我强烈建议阅读构建器模式的 GOF 定义。
    • +1 以弥补 @AngelO'Sphere 的 -1。 Espen 谈到的 Builder 模式是来自 Effective Java 2nd Ed 的 Josh Bloch。 (见this answer)。其中,Builder 使用的构造函数是私有的;该模式的一个目标是通过允许所有字段为最终字段(而不是通过 setter 初始化)来鼓励不变性;对于具有少量异构字段的对象,这确实是矫枉过正。 (尽管可能仍然值得考虑使用静态工厂方法和私有构造函数,这样以后添加 Builder 会很容易。)
    • 只有一条评论,你不知道未来,所以你不应该基于假设编写代码(除非下一个 sprint 明确说明不同)。编写代码,就好像您的规范是最终的一样。 (再一次,除非你知道下一个 sprint 明确表示不同)。这样一来,它最终将尽可能高效。
    【解决方案4】:

    构建器模式,当考虑到克服 Java 中缺少可选参数的想法时,您将失去编译器提供的静态分析(以及 IDE 提供的所有不错的重构功能)。这意味着您将仅在运行时检测到某些强制参数丢失,而不是让您的 IDE 立即告诉您有问题...

    【讨论】:

      【解决方案5】:

      与望远镜构造函数比较

      • 静态分析丢失
      • 对于缺少强制参数 需要在某处抛出和捕获异常
      • 如果您在构建器中使用装箱类型来表示尚未设置的原始值,那么会进行大量自动装箱/拆箱 - 其中 允许很难发现的 NullPointerExceptions。没有这样的 望远镜构造函数中的问题 - 你可以只传递原语 价值观。
      • 更多代码

      【讨论】:

        猜你喜欢
        • 2013-08-20
        • 2015-06-26
        • 1970-01-01
        • 2020-09-18
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        相关资源
        最近更新 更多