Académique Documents
Professionnel Documents
Culture Documents
I. Définition
Un patron de conception (Design Pattern) est une solution à un problème récurrent dans un
contexte donné. On peut considérer un patron de conception comme une formalisation de
bonnes pratiques, ce qui signifie qu'on privilégie les solutions éprouvées.
Création
Structure
- Adaptateur (Adapter)
- Pont (Bridge)
- Objet composite (Composite)
- Décorateur (Decorator)
- Façade (Facade)
- Poids-mouche ou poids-plume (Flyweight)
- Proxy (Proxy)
Comportement
1
- Médiateur (Mediator)
- Memento (Memento)
- Observateur (Observer)
- État (State)
- Stratégie (Strategy)
- Patron de méthode (Template Method)
- Visiteur (Visitor)
……….
1. Singleton
Garantit qu'une classe n'a qu'une et une seule instance, tous les objets qui utilisent une
instance de cette classe, utilisent la même instance
Exemples :
Gestion centralisée d’une ressource :
_ Interne : un objet qui est un compteur « global »
_ Externe : un objet qui gère la réutilisation d’une connexion à une base de données
Classes qui ne devraient avoir qu’une seule instance à la fois :
_ Horloge du système
_ Fenêtre principale d’une application
_ Générateur de nombre aléatoire (random number generator)
Code en Java :
2
s.setValue(20);
System.out.println("La valeur de i est " + s.getValue());
System.out.println("La valeur de i est " + s2.getValue());
}
}
2. Factory
Une fabrique de création (ou factory) est une classe qui n'a pour rôle que de construire des
objets. Cette classe utilise des interfaces ou des classes abstraites pour masquer l'origine des
objets.
/**
* Retourne un objet Classe interagissant avec la BDD
* @return DAO
*/
public static DAO getClasseDAO(){
return new ClasseDAO(conn);
}
/**
* Retourne un objet Professeur interagissant avec la BDD
3
* @return DAO
*/
public static DAO getProfesseurDAO(){
return new ProfesseurDAO(conn);
}
/**
* Retourne un objet Eleve interagissant avec la BDD
* @return DAO
*/
public static DAO getEleveDAO(){
return new EleveDAO(conn);
}
/**
* Retourne un objet Matiere interagissant avec la BDD
* @return DAO
*/
public static DAO getMatiereDAO(){
return new MatiereDAO(conn);
}
}
3. Injection de dépendance :
Le patron de conception Java Injection de dépendance nous permet de supprimer les
dépendances codées en dur et de rendre notre application faiblement couplée, extensible et
maintenable.
package ma.fstt.wdi;
}
}
4
package ma.fstt.wdi;
import java.util.ArrayList;
import java.util.List;
productList.add(product);
productList.stream().forEach(paymentService::pay);
cart.buy();
}
}
package ma.fstt.wdi;
Si on veut ajouter un service pour payer avec une carte de crédit. Dans ce cas, nous
devrons modifier l’implémentation de l’objet Cart pour utiliser un autre service de
paiement - et ce n’est pas la responsabilité de Cart.
L’objet Cart doit faire exactement ce qu’il est censé faire. Il contient une liste de
produits et propose une méthode pour les acheter.
Le service de paiement est une dépendance externe ici. Ce service est utilisé par le
panier, mais il ne lui incombe pas de le créer. Le panier devrait juste recevoir cette
dépendance.
5
Il existe plusieurs façons de procéder, pour résoudre ce problème, généralement en
utilise le patron de conception injection des dépendances selon 3 méthodes : par
constructeur, par accesseur « gets /sets », ou bien par interfaces.
package ma.fstt.di;
package ma.fstt.di;
@Override
public void pay(Product product) {
System.out.println("Payed with card");
}
package ma.fstt.di;
@Override
public void pay(Product product) {
System.out.println("Payed with cash");
}
package ma.fstt.di;
@Override
public void pay(Product product) {
System.out.println("Payed with check");
}
package ma.fstt.di;
if (paymentType == null) {
return null;
6
if (paymentType.equalsIgnoreCase("CASH")) {
if (paymentType.equalsIgnoreCase("CARD")) {
if (paymentType.equalsIgnoreCase("CHECK")) {
return null;
}
}
package ma.fstt.di;
import java.util.ArrayList;
import java.util.List;
this.paymentService = paymentService;
productList.add(product);
productList.stream().forEach(paymentService::pay);
7
cart.buy();
Note :
IoC « Inversion of Control » est un terme générique signifiant plutôt que d'avoir l’application,
qui appelle les méthodes dans un Framework, c’est le Framework qui se chargera d’appeler
les implémentations fournies par l'application.
DI « Dependency Injection » est une forme d'IoC, où les implémentations sont transmises à
un objet via des recherches de constructeurs / setters / services, sur lesquelles l'objet "dépend"
afin de se comporter correctement.