2013-04-21 29 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