Monteur (patron de conception)

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article peut contenir un travail inédit ou des déclarations non vérifiées ().

Vous pouvez aider en ajoutant des références ou en supprimant le contenu inédit. Voir la page de discussion pour plus de détails.

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article ne cite pas suffisamment ses sources ().

Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ».

En pratique : Quelles sources sont attendues ? Comment ajouter mes sources ?

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article n’est pas rédigé dans un style encyclopédique ().

Vous pouvez améliorer sa rédaction !

Page d’aide sur l’homonymie

Pour la profession dans le secteur du cinéma, voir Monteur.

Un monteur (builder) est un patron de conception utilisé en programmation pour la création 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.

Par exemple, l'objet source peut être une liste de caractères ou d'images dans un message qui doit être codé. Dans ce cas, un objet directeur est nécessaire pour fournir des informations concernant l'objet source à la classe Monteur. La classe Monteur abstraite pourrait être une liste d'appel de l'interface que la classe directeur utilise comme 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 chiffrerait 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 chiffrement d’ 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.

Son but est de 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
    • classe abstraite qui contient le produit
  • 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

/* Produit */
class Pizza {
  private String pate = "";
  private String sauce = "";
  private String garniture = "";

  public void setPate(String pate)          { this.pate = pate; }
  public void setSauce(String sauce)         { this.sauce = sauce; }
  public void setGarniture(String garniture) { this.garniture = garniture; }
}


/* Monteur */
abstract class MonteurPizza {
  protected Pizza pizza;

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

  public abstract void monterPate();
  public abstract void monterSauce();
  public abstract void monterGarniture();
}

/* MonteurConcret */
class MonteurPizzaReine extends MonteurPizza {
  public void monterPate()      { pizza.setPate("croisée"); }
  public void monterSauce()     { pizza.setSauce("douce"); }
  public void monterGarniture() { pizza.setGarniture("jambon+champignon"); }
}

/* MonteurConcret */
class MonteurPizzaPiquante extends MonteurPizza {
  public void monterPate()      { pizza.setPate("feuilletée"); }
  public void monterSauce()     { pizza.setSauce("piquante"); }
  public void monterGarniture() { pizza.setGarniture("pepperoni+salami"); }
}

/* Directeur */
class Serveur {
  private MonteurPizza monteurPizza;

  public void setMonteurPizza(MonteurPizza mp) { monteurPizza = mp; }
  public Pizza getPizza() { return monteurPizza.getPizza(); }

  public void construirePizza() {
    monteurPizza.creerNouvellePizza();
    monteurPizza.monterPate();
    monteurPizza.monterSauce();
    monteurPizza.monterGarniture();
  }
}

/* Un client commandant une pizza. */
class ExempleMonteur {
  public static void main(String[] args) {
    Serveur serveur = new Serveur();
    MonteurPizza monteurPizzaReine  = new MonteurPizzaReine();
    MonteurPizza monteurPizzaPiquante = new MonteurPizzaPiquante();

    serveur.setMonteurPizza(monteurPizzaReine);
    serveur.construirePizza();

    Pizza pizzas = serveur.getPizza();
  }
}

En Java, la désignation chainée est une approche conseillée pour la réalisation de monteurs[1].

PHP

/* Produit */
class Pizza {
  private $_pate = "";
  private $_sauce = "";
  private $_garniture = "";

  public function setPate($pate)
  { 
    $this->_pate = $pate; 
  }
  public function setSauce($sauce)
  { 
    $this->_sauce = $sauce; 
  }
  public function setGarniture($garniture) 
  { 
    $this->_garniture = $garniture; 
  }
}

/* Monteur */
abstract class MonteurPizza {
  protected $_pizza;

    public function getPizza()
    { 
      return $this->_pizza; 
    }
    public function creerNouvellePizza() {
      $this->_pizza = new Pizza(); 
    }

  abstract public function monterPate();
  abstract public function monterSauce();
  abstract public function monterGarniture();
}

/* MonteurConcret */
class MonteurPizzaReine extends MonteurPizza {
  public function monterPate()      
  {
    $this->_pizza->setPate("croisée"); 
  }
  public function monterSauce()     
  {
    $this->_pizza->setSauce("douce"); 
  }
  public function monterGarniture() 
  { 
    $this->_pizza->setGarniture("jambon+champignon"); 
  }
}

/* MonteurConcret */
class MonteurPizzaPiquante extends MonteurPizza {
  public function monterPate()      
  { 
    $this->_pizza->setPate("feuilletée"); 
  }
  public function monterSauce()     
  {
    $this->_pizza->setSauce("piquante"); 
  }
  public function monterGarniture() 
  {
    $this->_pizza->setGarniture("pepperoni+salami");
  }
}

/* Directeur */
class Serveur {
  private $_monteurPizza;

  public function setMonteurPizza(MonteurPizza $mp) 
  { 
    $this->_monteurPizza = $mp; 
  }
  public function getPizza()
  { 
    return $this->_monteurPizza->getPizza(); 
  }

  public function construirePizza() {
    $this->_monteurPizza->creerNouvellePizza();
    $this->_monteurPizza->monterPate();
    $this->_monteurPizza->monterSauce();
    $this->_monteurPizza->monterGarniture();
  }
}

/* Un client commandant une pizza. */
$serveur = new Serveur();
$monteurPizzaReine = new MonteurPizzaReine();
$monteurPizzaPiquante = new MonteurPizzaPiquante();

$serveur->setMonteurPizza($monteurPizzaReine);
$serveur->construirePizza();

$pizza = $serveur->getPizza();

Voir aussi

Patrons associés

  • Fabrique
  • Fabrique abstraite
  • Patron de méthode

Références

  1. Résumé sur les Fluent interfaces et Dsl en java
v · m
Patrons de conception
Création
  • Fabrique abstraite
  • Monteur
  • Fabrique
  • Prototype
  • Singleton
Structure
  • Adaptateur
  • Pont
  • Composite
  • Décorateur
  • Façade
  • Poids-mouche
  • Proxy
Comportement
Fonctionnel
  • Fermeture
  • Curryfication
  • Composition de fonctions
  • Foncteur
  • Monade
  • Générateur
Patron d'architecture
Autres patrons
  • icône décorative Portail de l’informatique