В последнее время я изучаю образцы дизайна. Я изо всех сил пытаюсь найти сценарий, в котором я могу реализовать шаблон построителя для этого сценария. У кого-нибудь есть какой-то пример?Builder design pattern
Любой ответ будет очень благодарен.
В последнее время я изучаю образцы дизайна. Я изо всех сил пытаюсь найти сценарий, в котором я могу реализовать шаблон построителя для этого сценария. У кого-нибудь есть какой-то пример?Builder design pattern
Любой ответ будет очень благодарен.
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();
}
-1 Строго говоря, это не является конструктором шаблонов рисунков. Строка - это только вспомогательный класс! Строитель используется для построения графика объектов, имеющих разные типы (а не только строки). Однако использование «строителя» в вашем примере очень похоже на шаблон. (Я не сделал тебя, хотя) –
@Angel O'Sphere: +1 Это хороший пример. Теперь эта реализация создает строку. Но кто сказал, что если другая реализация не может построить дерево выражений, которое может быть объединено с другим, упрощенным и т. Д. И это - разные возможные результаты от разных строителей с одним и тем же интерфейсом - является самым важным преимуществом шаблона clasic builder. –
Если у вас очень сложный объект (скажем, для работы требуется 3, 4 или более разных других объекта), вы должны использовать Builder
для правильного построения этого объекта.
Строитель шаблон часто используется для создания 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
спасибо большое – Pinchy
Как и предыдущий ответ ... это не «Конструктор шаблонов рисунков». Это только класс с именем «Builder». Шаблон используется для построения сложных графов объектов, а не просто строк. –
Рассмотрите конструктор, столкнувшись со многими параметрами конструктора. Следующая ссылка объясняет в хороших деталях также устранит все сомнения.
http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=2
В двух словах, когда есть много параметров конструктора вместо запоминания порядка и значения каждого параметра; шаблон builder может использоваться для упрощения передачи параметров, что упрощает программирование, улучшает читаемость, повышает уверенность в том, что параметры передаются по назначению.
Вы проверили примеры из Википедии? – Bozho
для интересного чтения: http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern – akf