« Patrons de conception/Monteur » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
ortho-nettoyage Typos: appellée → appelée, AWB
Ligne 1 : Ligne 1 :
Le '''monteur''' (''builder'') est un [[motif de conception]] utilisé pour la création d'une variété d'objets complexes à partir d'un objet source. L'objet source peut consister en une variété de parties contribuant individuellement à la création de chaque objet complet grâce à un ensemble d'appels à l'interface commune de la classe abstraite ''Monteur''.
Le '''monteur''' (''builder'') est un [[motif de conception]] utilisé pour la création d'une variété d'objets complexes à partir d'un objet source. L'objet source peut consister en une variété de parties contribuant individuellement à la création de chaque objet complet grâce à un ensemble d'appels à l'interface commune de la classe abstraite ''Monteur''.


Un exemple d'objet source est une liste de caractères ou d'images dans un message devant être encodé. Un objet directeur est nécessaire pour fournir les informations à propos de l'objet source vers la classe ''Monteur''. La classe ''Monteur'' abstraite pourrait être une liste d'appel de l'interface que la classe directeur utilise comme par exemple ''handleCharacter()'' ou ''handleImage()''. Chaque version concrète de la classe ''Monteur'' pourrait implémenter une méthode pour ces appels ou bien simplement ignorer l'information si appellée. Un exemple de monteur concret serait ''enigmaBuilder'' qui crypterait le texte, mais ignorerait les images.
Un exemple d'objet source est une liste de caractères ou d'images dans un message devant être encodé. Un objet directeur est nécessaire pour fournir les informations à propos de l'objet source vers la classe ''Monteur''. La classe ''Monteur'' abstraite pourrait être une liste d'appel de l'interface que la classe directeur utilise comme par exemple ''handleCharacter()'' ou ''handleImage()''. Chaque version concrète de la classe ''Monteur'' pourrait implémenter une méthode pour ces appels ou bien simplement ignorer l'information si appelée. Un exemple de monteur concret serait ''enigmaBuilder'' qui crypterait le texte, mais ignorerait les images.


Dans l'exemple précédent, le logiciel va créer une classe ''Monteur'' spécifique, ''enigmaBuilder''. Cet objet est passé à un objet directeur simple qui effectue une itération à travers chaque donnée du message principal de l'objet source. La classe monteur crée, incrémentalement, son projet final.
Dans l'exemple précédent, le logiciel va créer une classe ''Monteur'' spécifique, ''enigmaBuilder''. Cet objet est passé à un objet directeur simple qui effectue une itération à travers chaque donnée du message principal de l'objet source. La classe monteur crée, incrémentalement, son projet final.

Version du 9 décembre 2006 à 10:11

Le monteur (builder) est un motif de conception utilisé pour la création d'une variété d'objets complexes à partir d'un objet source. L'objet source peut consister en une variété de parties contribuant individuellement à la création de chaque objet complet grâce à un ensemble d'appels à l'interface commune de la classe abstraite Monteur.

Un exemple d'objet source est une liste de caractères ou d'images dans un message devant être encodé. Un objet directeur est nécessaire pour fournir les informations à propos de l'objet source vers la classe Monteur. La classe Monteur abstraite pourrait être une liste d'appel de l'interface que la classe directeur utilise comme par exemple handleCharacter() ou handleImage(). Chaque version concrète de la classe Monteur pourrait implémenter une méthode pour ces appels ou bien simplement ignorer l'information si appelée. Un exemple de monteur concret serait enigmaBuilder qui crypterait le texte, mais ignorerait les images.

Dans l'exemple précédent, le logiciel va créer une classe Monteur spécifique, enigmaBuilder. Cet objet est passé à un objet directeur simple qui effectue une itération à travers chaque donnée du message principal de l'objet source. La classe monteur crée, incrémentalement, son projet final. Finalement, le code principal va demander l'objet final depuis le Monteur et ensuite détruire celui-ci et l'objet directeur. Par la suite, si jamais un remplacement de la technique de cryptage de enigmaBuilder par une autre se faisait sentir, une nouvelle classe Monteur pourrait être substituée avec peu de changements pour la classe directeur et le code principal. En effet, le seul changement serait la classe Monteur actuelle passée en paramètre au directeur.

But : Séparer la construction d'un objet complexe de la représentation afin que le même processus de construction puisse créer différentes représentations.

Diagramme de classes

Monteur Structure

  • Monteur
    • interface abstraite pour construire des produits
  • MonteurConcret
    • fournit une implémentation de Monteur
    • construit et assemble les différentes parties des produits
  • Directeur
    • construit un objet utilisant la méthode de conception Monteur
  • Produit
    • l'objet complexe en cours de construction

Exemple

Java

/** "Product" */
class Pizza {
  private String dough = "";
  private String sauce = "";
  private String topping = "";

  public void setDough(String dough)     { this.dough = dough; }
  public void setSauce(String sauce)     { this.sauce = sauce; }
  public void setTopping(String topping) { this.topping = topping; }
}


/** "Abstract Builder" */
abstract class PizzaBuilder {
  protected Pizza pizza;

  public Pizza getPizza() { return pizza; }
  public void createNewPizzaProduct() { pizza = new Pizza(); }

  public abstract void buildDough();
  public abstract void buildSauce();
  public abstract void buildTopping();
}

/** "ConcreteBuilder" */
class HawaiianPizzaBuilder extends PizzaBuilder {
  public void buildDough()   { pizza.setDough("cross"); }
  public void buildSauce()   { pizza.setSauce("mild"); }
  public void buildTopping() { pizza.setTopping("ham+pineapple"); }
}

/** "ConcreteBuilder" */
class SpicyPizzaBuilder extends PizzaBuilder {
  public void buildDough()   { pizza.setDough("pan baked"); }
  public void buildSauce()   { pizza.setSauce("hot"); }
  public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
}


/** "Director" */
class Waiter {
  private PizzaBuilder pizzaBuilder;

  public void setPizzaBuilder(PizzaBuilder pb) { pizzaBuilder = pb; }
  public Pizza getPizza() { return pizzaBuilder.getPizza(); }

  public void constructPizza() {
    pizzaBuilder.createNewPizzaProduct();
    pizzaBuilder.buildDough();
    pizzaBuilder.buildSauce();
    pizzaBuilder.buildTopping();
  }
}


/** A customer ordering a pizza. */
class BuilderExample {
  public static void main(String[] args) {
    Waiter waiter = new Waiter();
    PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
    PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder();

    waiter.setPizzaBuilder( hawaiian_pizzabuilder );
    waiter.constructPizza();

    Pizza pizza = waiter.getPizza();
  }
}