【问题标题】:Performance of Cloning (either by Cloneable Interface or Copy Constructor) a object vs Creating a new object in Prototype Pattern克隆(通过可克隆接口或复制构造函数)对象与在原型模式中创建新对象的性能
【发布时间】:2019-10-04 07:20:43
【问题描述】:

最近,在学习设计模式时,我了解到原型模式在需要创建大量对象的场景中非常有用且性能高效。

Prototype Pattern 还通过使用 Prototype Pattern 中的 Cloneable 接口或 Copy Constructor 将创建过多对象的开销降至最低。

但是,我想知道如何克隆或复制对象比创建新对象更有效。 JVM 级别的解释会很棒。

这是使用原型模式的唯一原因吗?

【问题讨论】:

  • cloning is broken 并且不应使用。必须实现一个复制构造函数,然后使用new 调用它,所以它只不过是创建一个新对象。是什么让您认为该模式更有效地创建对象?
  • 这是我关注的课程链接,它解释了当我们想要有效地创建大量对象时使用原型pluralsight_course_design_patterns

标签: java design-patterns prototype-pattern


【解决方案1】:

原型模式不用于性能(尽管根据 Ioannis 的链接,它已被用作性能黑客)。它的用途是让您可以从(可能发生变化的)原型创建新对象。

需要一些“克隆”方法,这样您就不必关心原型的状态。您只需致电prototype.someMethodThatReturnsACopy(),该对象就可以使用了。您可以使用clone() 或其他方式来创建该副本,如果您真的需要,甚至可以手动构建一个。

【讨论】:

  • 那么这种设计模式的常见用途是什么?为什么要创建这个?有没有 Java 库使用它的例子?
  • 这是一个旧模式,是GoF 书籍的一部分。您不太可能在任何地方看到它直接实施。然而,相关的工厂模式在(Java)代码中仍然有些普遍。
  • 工厂模式和原型模式有关系吗?
  • 是的,这就是我写“相关工厂模式”的原因。
【解决方案2】:

有趣的是,您最近了解到原型模式是高性能的,因为该设计模式已经过时了。 你可以看看这个stackoverflow question 快10岁了

【讨论】:

    【解决方案3】:

    之前的答案是正确的,因为原型模式在 Java 中不是有用的性能工具。

    GoF 书第 121 页所述,

    Prototype 对于像 C++ 这样的静态语言特别有用,其中类不是对象,在运行时几乎没有或没有类型信息可用。在 Smalltalk 或 Objective C 等语言中,它不太重要,它们提供相当于原型(即类对象)来创建每个类的实例。这种模式内置于基于原型的语言(如 Self)中,其中所有对象的创建都是通过克隆原型来完成的。

    一种更现代的基于原型的语言是 JavaScript。在prototype based vs. class based inheritance 中讨论了一些利弊。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2013-04-06
      • 2011-10-21
      • 1970-01-01
      • 2011-10-17
      • 2011-03-28
      相关资源
      最近更新 更多