2012-02-18 52 views
4

如果你正在做一些線性鏈(java的StringBuilder)或者創建一個包含許多屬性的對象(PizzaBuilder),這看起來好像生成器模式很好。有沒有一種乾淨的方式來使用Builder模式來構建一個多級樹?

它可以擴展到構建一棵樹而不指定可能會令人困惑的節點位置?

a 
/| \ 
c d e 
    /\ 
    f g 

    TreeBuilder tb.addNode(levelNumber, parentNumber, nodeName) // I think this is terrible 

    tb.addNode(2, 3, g) //terrible 

或者對於這種模式只是不是一個好主意?

感謝

+1

StringBuilder不遵循Builder模式。構建器模式「定義了創建對象的實例,但讓子類決定實例化哪個類」。 – 2012-02-18 03:04:22

+1

「建設者」,你的意思是一個所謂的流利建設者班?如果是這樣,[這個問題](http://stackoverflow.com/questions/563328/elegant-and-maintainable-way-of-populating-tree-structures-in-c-sharp)有點解決它。在這個組中,我最喜歡[這個答案](http://stackoverflow.com/a/563380/1215441)。 – cutchin 2012-02-18 04:41:58

+0

@佳華 - 您提供的報價爲工廠方法,而不是生成器(並且可在GoF的封面找到)。 – kdgregory 2012-02-18 13:17:12

回答

2

Builder模式是當你有一組屬性的一類,並有預定義類型的各種屬性集該類有用的。

你只想做一棵樹:

a.add(c, d, e); 
e.add(f, g); 
8

是,生成器模式,可用於樹木。樹中的每個節點都需要其自己的構建器實例。

下面是一個根和兩個子節點的例子。

Tree t = new TreeBuilder() 
     .addNode(new TreeBuilder() 
        .addNode("foo") 
        .addNode("bar") 
        .toTree() 
     .toTree() 

而且這裏有一個真實的例子,用來構建XML:http://practicalxml.svn.sourceforge.net/viewvc/practicalxml/trunk/src/main/java/net/sf/practicalxml/builder/(中的package.html包含示例代碼)。

相關問題