2010-12-11 85 views
3

我最近一直在研究设计模式。我正在努力寻找一种可以为该场景实现构建器模式的场景。有没有人有任何例子?生成器设计模式

任何答案将不胜感激。

+0

你检查了维基百科例子? – Bozho 2010-12-11 12:48:05

+0

有趣的阅读:http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern – akf 2010-12-11 12:52:28

回答

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严格地说这个不是设计模式生成器。它只是一个帮助类来构造一个字符串!构建器用于构建具有不同类型的对象的图形(不仅是字符串)。然而,在你的例子中,“构建器”的使用与模式非常相似。 (虽然我并没有模拟你) – 2011-06-03 13:18:02

+1

@Angel O'Sphere:+1这是一个很好的例子。现在,这个实现构造了一个字符串。但是谁说,如果另一个实现不能构造一个可以与另一个实现相结合的表达式树,简化等等。而这个 - 来自具有相同接口的不同构建器的不同可能结果 - 是clasic builder模式的最重要的好处。 – 2011-07-06 09:21:28

1

如果你有一个非常复杂的对象(说出需要3,4或更多不同的其他对象来操作的东西),你可以使用Builder来正确构造这个对象。

+0

例如?那个复杂的对象可能是什么? – Pinchy 2010-12-11 12:51:47

+0

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

+0

非常感谢你 – Pinchy 2010-12-22 19:50:10

0

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 
+0

非常感谢 – Pinchy 2010-12-22 19:49:54

+0

像以前的答案...这不是“设计模式生成器”。它只是一个名为“Builder”的类。该模式用于构造复杂的对象图,而不仅仅是字符串。 – 2011-06-03 13:19:37