生成器设计模式
回答
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严格地说这个不是设计模式生成器。它只是一个帮助类来构造一个字符串!构建器用于构建具有不同类型的对象的图形(不仅是字符串)。然而,在你的例子中,“构建器”的使用与模式非常相似。 (虽然我并没有模拟你) – 2011-06-03 13:18:02
@Angel O'Sphere:+1这是一个很好的例子。现在,这个实现构造了一个字符串。但是谁说,如果另一个实现不能构造一个可以与另一个实现相结合的表达式树,简化等等。而这个 - 来自具有相同接口的不同构建器的不同可能结果 - 是clasic builder模式的最重要的好处。 – 2011-07-06 09:21:28
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 2010-12-22 19:49:54
像以前的答案...这不是“设计模式生成器”。它只是一个名为“Builder”的类。该模式用于构造复杂的对象图,而不仅仅是字符串。 – 2011-06-03 13:19:37
在面对许多构造函数参数时考虑构建器。以下链接详细解释将清除所有疑问。
http://www.drdobbs.com/jvm/creating-and-destroying-java-objects-par/208403883?pgno=2
在当有许多构造参数,而不是记住的顺序和各参数的含义简而言之;生成器模式可用于简化参数传递,从而简化编程,提高可读性,增加参数按预期传递的置信度。
- 1. 反转生成器模式
- 2. 实现生成器模式
- 3. 对象生成器模式
- 4. 我在rails生成设计之前运行了rails生成设计模型:install
- 5. PostgreSQL模式设计器
- 6. 基于数据源生成多个文档的设计模式
- 7. Qt设计器代码生成问题
- 8. 生成设计控制器是空的
- 9. 生成器vs外观设计图案
- 10. 生成器设计模式:为什么我们需要一个Director?
- 11. 报告生成器 - 我需要一些聪明的设计模式;)
- 12. 带继承的生成器设计模式:有更好的方法吗?
- 13. 设计模式
- 14. 设计模式
- 15. 设计模式
- 16. 设计模式
- 17. 设计模式
- 18. 设计模式?
- 19. 语言集成的设计模式
- 20. 设计模式:保存私有成员
- 21. 赞成Javascript设计模式勘误?
- 22. 如何设计生成Python代码的代码生成器
- 23. MVC设计模式 - 设计模型
- 24. 使用AES计数器模式生成一次性密钥
- 25. 将彗星与彗星服务器集成的设计模式
- 26. PDF生成的设计
- 27. gwt设计器(设计模式或运行时)的检测模式
- 28. 使用版本库设计模式和装饰器设计模式来进行
- 29. 有效Java中的生成器模式
- 30. 分组生成器的Pythonic模式
你检查了维基百科例子? – Bozho 2010-12-11 12:48:05
有趣的阅读:http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern – akf 2010-12-11 12:52:28