2012-02-18 9 views
4

Кажется, что шаблон строителя хорош, если вы делаете линейную цепочку вещей (java's 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. Шаблон построителя "определяет экземпляр для создания объекта, но позволяет подклассам решать, какой класс необходимо создать". –

+1

«Строитель», вы имеете в виду так называемый свободный класс строителя? Если это так, [этот вопрос] (http://stackoverflow.com/questions/563328/elegant-and-maintainable-way-of-populating-tree-structures-in-c-sharp) обращается к нему несколько. Из группы мне понравился [этот ответ] (http://stackoverflow.com/a/563380/1215441) лучше всего. – cutchin

+0

@Jiahua - указанная вами цитата предназначена для Factory Method, а не Builder (и находится на внутренней крышке GoF). – kdgregory

ответ

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 содержит пример кода).