【问题标题】:Design pattern: Only instanciate class if it is not a duplicate of an already instanciated object设计模式:仅在类不是已实例化对象的副本时才实例化类
【发布时间】:2013-04-21 12:50:31
【问题描述】:

我有一个类 RT (本质上)对有根树进行建模。

假设我已经有一个实例rt1 持有以下树:

   1
  / \
 0   2

现在,我可以构造另一个包含以下树的实例 (rt2):

   5
  / \
 4   9

但是,很明显,这两棵树是同构的(即它们具有相同的结构,并且在重命名节点之前都是相同的)。我已经有一个计算两个有根树是否同构的例程(所以这个子问题已经解决了)。

现在我的问题:出于我的目的,我想要一种设计模式,它可以防止程序实际为rt2 构造一个新实例,而只是提供对元素rt1 的引用(它已经构造)。

另一方面,考虑另一棵树 (rt3),即:

    1
   / \
  2   5
 /
7

为这个图调用的构造例程应该创建一个代表这个图的新实例(因为它与rt1 不同构,因此到目前为止还没有生成)。

有这种事吗?

我查看了工厂模式,但不确定(工厂似乎总是构造一个新元素)。谁能告诉我解决这个特定问题的“最佳实践”方式。

【问题讨论】:

  • 您还需要对对象进行全局访问吗?单身人士可能是要走的路。
  • 工厂可以缓存构造的元素并返回它们,而不是构造新的实例。但是 create() 方法的参数是什么?
  • @JBNizet 感谢您的回答。这与我的想法一致。这是“在现实中”完成的吗?还是有其他可能性(由于某些原因被更广泛地使用)? create() 方法的参数将是(例如)树的边缘。

标签: design-patterns factory


【解决方案1】:

您可以使用享元模式。

在 flyweights 数组中,您保存所有树,其中树的类型为 ITree(Flyweight)。 ConcreteFlyweight 可以称为 BinaryTree 或您的名字 RT。你必须在你的树实现中实现相等的操作才能在GetFlyweight方法中使用。

【讨论】:

  • 这似乎是我要找的。​​span>
【解决方案2】:

通常,当您想要一个对象的一个​​实例并想要返回该单个实例时,您会使用单例。不完全确定您是如何将其与创建树联系起来的,但它可能是 Singelton 和 Factory 的混合体。您所说的所有模式都是创建类型模式:http://en.wikipedia.org/wiki/Creational_pattern

这里是单例的描述:http://en.wikipedia.org/wiki/Singleton_pattern

【讨论】:

    【解决方案3】:

    在我看来,您希望构建一个原型实例。在这种情况下,您需要使用原型设计模式。

    见:http://www.dofactory.com/Patterns/PatternPrototype.aspx

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2015-06-11
      • 2013-03-28
      • 1970-01-01
      • 2015-04-07
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多