2010-12-11 7 views
3

J'ai étudié les motifs de conception récemment. J'ai du mal à trouver un scénario dans lequel je peux implémenter un modèle de générateur pour ce scénario. Quelqu'un a-t-il un exemple?Motif de conception Builder

Aucune réponse ne sera plus appréciée.

+0

avez-vous vérifié les exemples wikipedia? – Bozho

+0

pour une lecture intéressante: http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern – akf

Répondre

4

SQLOrm sert comme un bon exemple de combiner le modèle constructeur avec un ensemble approprié de noms de méthodes rendant la construction de SQL sentir comme travailler avec un DSL.

par exemple

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(); 
} 

devient

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 Strictement parlant n'est pas le Design Pattern Builder. C'est seulement une classe d'aide pour construire une chaîne! Un générateur est utilisé pour construire un graphique d'objets ayant différents types (pas seulement des chaînes). Cependant, l'utilisation du "constructeur" dans votre exemple est très similaire au modèle. (Je ne vous ai pas modéré, cependant) –

+1

@ Angel O'Sphere: +1 Ceci est un bon exemple. Maintenant, cette implémentation construit une chaîne. Mais qui a dit si une autre implémentation ne peut pas construire un arbre d'expression qui peut être combiné avec un autre, simplifié etc. Et ceci - différents résultats possibles de différents constructeurs avec la même interface - est l'avantage le plus important du modèle de constructeur clasic. –

1

Si vous avez un objet très complexe (disons quelque chose qui nécessite 3, 4 ou plusieurs autres objets différents pour fonctionner), vous devez utiliser un Builder pour construire correctement cet objet.

+0

Par exemple? Qu'est-ce que cet objet complexe pourrait être? – Pinchy

+0

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

+0

merci beaucoup – Pinchy

0

Le modèle Builder est souvent utilisé pour construire des documents HTML et XML. Exemple:

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

merci beaucoup – Pinchy

+0

Comme la réponse précédente ... ce n'est pas le "Design Pattern Builder". C'est seulement une classe avec "Builder" dans son nom. Le modèle est utilisé pour construire des graphes d'objets complexes, pas simplement des chaînes. –

0

Considérons un générateur lorsqu'il est confronté à de nombreux paramètres de constructeur. Le lien suivant explique dans les moindres détails va effacer tous les doutes aussi bien.

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

En un mot quand il y a beaucoup de paramètres du constructeur au lieu de se rappeler l'ordre et la signification de chaque paramètre; Le motif du générateur peut être utilisé pour simplifier le passage des paramètres, simplifiant ainsi la programmation, améliorant la lisibilité, augmentant la confiance que les paramètres sont transmis comme prévu.

Questions connexes