2010-12-11 2 views
3

В последнее время я изучаю образцы дизайна. Я изо всех сил пытаюсь найти сценарий, в котором я могу реализовать шаблон построителя для этого сценария. У кого-нибудь есть какой-то пример?Builder design pattern

Любой ответ будет очень благодарен.

+0

Вы проверили примеры из Википедии? – Bozho

+0

для интересного чтения: http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern – akf

ответ

4

SQLOrm служит хорошим примером сочетания шаблона построителя с соответствующим набором имен методов, что делает конструкцию SQL похожей на работу с DSL.

например

private String getPersonAndmaybePet_JavaStr(boolean personName, boolean isAdult, int[] petTypes) { 
    StringBuilder sb = new StringBuilder(); 
    // do SELECT 
    sb.append("SELECT "); 
    if(personName) 
    sb.append("person.name,"); 
    if(petTypes != null) 
    sb.append("pet.*,"); 

    // do FROM 
    sb.delete(sb.length() - 1, sb.length()); // remove last comma 
    sb.append(" FROM person,"); 
    if(petTypes != null) 
    sb.append(" Pet,"); 

    // do WHERE 
    sb.delete(sb.length() - 1, sb.length()); // remove last comma 
    sb.append(" WHERE "); 
    if(isAdult) 
    sb.append(" person.age >= 18"); 
    else 
    sb.append(" person.age < 18"); 

    if(petTypes != null) { 
    StringBuilder commaList = new StringBuilder(); 
    for(int id : petTypes) { 
     commaList.append(id); 
     commaList.append(","); 
    } 
    commaList.delete(commaList.length() - 1, commaList.length()); 
    sb.append(" AND person.pet_id = pet.id AND pet.pettype IN (" + commaList.toString() + ")"); 
    } 
    return sb.toString(); 
} 

становится

private String getPersonAndmaybePet(boolean personName, boolean isAdult, int[] petTypes) { 
    SelectBuilder qry = new SelectBuilder(); 

    if(personName) 
    qry.select("person.name").from("person");  

    if(isAdult) 
    qry.from("person").where().and("person.age >= 18"); 
    else 
    qry.from("person").where().and("person.age < 18"); 

    if(petTypes != null) { 
    qry.select("pet.*").from("Pet") // 
      .where() // 
      .and("person.pet_id = pet.id") // 
      .and("pet.pettype IN (#)", QueryBuilderHelper.numbers(petTypes)); 
    } 
    return qry.toSql(); 
} 
+0

-1 Строго говоря, это не является конструктором шаблонов рисунков. Строка - это только вспомогательный класс! Строитель используется для построения графика объектов, имеющих разные типы (а не только строки). Однако использование «строителя» в вашем примере очень похоже на шаблон. (Я не сделал тебя, хотя) –

+1

@Angel O'Sphere: +1 Это хороший пример. Теперь эта реализация создает строку. Но кто сказал, что если другая реализация не может построить дерево выражений, которое может быть объединено с другим, упрощенным и т. Д. И это - разные возможные результаты от разных строителей с одним и тем же интерфейсом - является самым важным преимуществом шаблона clasic builder. –

1

Если у вас очень сложный объект (скажем, для работы требуется 3, 4 или более разных других объекта), вы должны использовать Builder для правильного построения этого объекта.

+0

Например? Что это за сложный объект? – Pinchy

+0

@ Pinchy - http://stackoverflow.com/questions/925176/is-there-an-example-of-the-builder-pattern-in-the-net-bcl – Oded

+0

Большое вам спасибо – Pinchy

0

Строитель шаблон часто используется для создания HTML и XML документов. Пример:

require 'markaby' # Markaby is an HTML builder library for Ruby 

builder = Markaby::Builder.new 

builder.html { 
    head { 
    title 'Sample Title' 
    link href: 'style.css', rel: 'stylesheet' 
    } 

    body { 
    h1 'Sample Title' 
    ul { 
     li 'Item 1' 
     li 'Item 2' 
    } 
    } 
} 

print builder 
+0

спасибо большое – Pinchy

+0

Как и предыдущий ответ ... это не «Конструктор шаблонов рисунков». Это только класс с именем «Builder». Шаблон используется для построения сложных графов объектов, а не просто строк. –

0

Рассмотрите конструктор, столкнувшись со многими параметрами конструктора. Следующая ссылка объясняет в хороших деталях также устранит все сомнения.

http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=2

В двух словах, когда есть много параметров конструктора вместо запоминания порядка и значения каждого параметра; шаблон builder может использоваться для упрощения передачи параметров, что упрощает программирование, улучшает читаемость, повышает уверенность в том, что параметры передаются по назначению.