2013-04-21 58 views
1

我有一个类RT建模一个有根树(实质上)。设计模式:只有实例类,如果它不是已经实例化的对象的副本

比方说,我已经拿着下面的树实例rt1

1 
/\ 
0 2 

现在,我可以构造另一个实例(rt2)持以下三种:

5 
/\ 
4 9 

然而,很明显这两棵树是同构的(即它们具有相同的结构,并且与重命名节点相同)。我已经有了一个常规计算,两棵有根树是否是同构的(所以这个子问题已经解决了)。

现在我的问题:为了我的目的,我想要一个设计模式,防止程序实际构建一个新的实例rt2,而只是给元素rt1(它已经构建)的引用。

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

1 
/\ 
    2 5 
/
7 

呼吁该图应该创建表示此图的新实例(因为这不是同构rt1建设程序,因此 - 至今尚未产生)。

有这样的事吗?

我看着工厂模式,但我不知道(工厂似乎总是构建一个新的元素)。任何一个人都可以告诉我一种解决这个特殊问题的“最佳实践”方法。

+0

您是否需要全局访问对象?辛格尔顿可能是当时要走的路。 – 2013-04-21 12:53:49

+0

工厂可以缓存构造元素并返回它们而不是构造新的实例。但是create()方法的参数是什么? – 2013-04-21 12:56:13

+0

@JBNizet感谢您的回答。这是我的走向的路线。这是“现实”吗?或者还有其他可能性(由于某些原因更广泛使用)? create()方法的参数是(例如)树的边缘。 – phimuemue 2013-04-21 12:58:49

回答

1

您可以使用轻量级的模式。

1

在飞锤数组你持有的所有你的树,其中树是ITree型(Flyweight)的。 ConcreteFlyweight可以称为BinaryTree或作为你的名字RT。你必须在你的树实现中实现相同的操作,以便在GetFlyweight方法中使用。

+0

这似乎是我正在寻找。 – phimuemue 2013-04-22 08:12:18