Design Patterns en Java : Singleton et Plus
Design Patterns en Java : Singleton et Plus
design patterns
1. À quoi servent les design patterns
2. Types de design patterns
3. Les principaux design patterns
ENSA Oujda ▪ Singleton Design Pattern
Cycle d’ingénieur - DSCC 1ère Année ▪ Dao Design Pattern
▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
POO en java ▪ Composit Design Pattern
▪
Implémentation des ▪
Strategy Design Pattern
Observer Design Pattern
design patterns
Pour chaque design pattern, une démonstration qui montre:
▪ L’utilité du design pattern
▪ Le modèle: diagramme de classes
@[Link]@[Link] ▪ Un exemple : Modèle + son implémentation
▪AI - Data Science – Machine Learning – Deep Learning ▪ Un exercice avec solution
▪Java – J2EE – Angular - Design
▪Python - C- C++ - Data Structures - Optimization
Les design patterns: à quoi peuvent servir?
▪ Les design pattern présentent des bonnes pratiques de conception en se basant sur les expériences des autres
▪ Se sont des solutions éprouvées et réutilisables à des problèmes de conception courants.
▪ Ils offrent plusieurs avantages qui aident les développeurs à créer des systèmes robustes, flexibles et maintenables.
▪ Réutilisation: ils permettent de réutiliser des solutions éprouvées à des problèmes courants. En appliquant un pattern
approprié, les développeurs peuvent éviter de réinventer la roue et gagner du temps en utilisant des approches déjà
testées et validées.
▪ Maintenabilité: Les systèmes conçus en utilisant des design patterns sont généralement plus faciles à maintenir. Les
patterns fournissent une structure claire et compréhensible, ce qui facilite la compréhension du code et sa modification
ultérieure.
▪ Flexibilité: ils encouragent la conception de systèmes flexibles et extensibles
▪ Découplage: ils aident à réduire les dépendances entre les composants d'un système, ce qui facilite leur isolation, leur
testabilité et leur réutilisation.
▪ Communication facile: ils fournissent un vocabulaire commun pour décrire les solutions de conception.
▪ Résolution des problèmes complexes: Les design patterns offrent des stratégies éprouvées pour résoudre des problèmes
complexes de conception.
▪ Pour assurer ces points forts, les design patterns sont mis en place en se basant sur les interfaces et les classes abstraites
Les types de design patterns
▪ Il existe plusieurs design pattern
▪ Ils se sont classifiés en trois catégories:
▪ Les patterns de création
▪ Pour créer des objets de la manière la plus appropriée relativement au contexte
▪ Singleton, Factory, Abstract Factor, Builder, Prototype
▪ Les patterns de structuration
▪ Pour composer des objets avec des structures plus grande. Ils facilitent la création des relations entre les entités.
▪ Dao, Abstract Dao, Decorator, Composite, Adapter, Bridge, Façade, Flyweight, Proxy…
▪ Les patterns de comportements
▪ Pour décrire les interactions et la collaboration entre objets afin de répondre à des fonctionnalités complexes
▪ Observer, Strategy, State, Template Method, Visitor, Momento, Iterator..
JAVA – Implémentation des principaux
design patterns
1. À quoi servent les design patterns
2. Types de design patterns
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
Singleton ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
Au lieu de
@15db9742 @6d06d69c @7852e922
… … …
Ref créée avec class1 Ref créée avec class2 Ref créée avec class3
Sans singleton ClasseNotSingleton
class A { final class ClasseNotSingleton { - data: type
public void f(){ private String data="une data";
ClasseNotSingleton s=new ClasseNotSingleton(); public ClasseNotSingleton(){
[Link]("ref créée dans f: "+s); + ClasseNotSingleton()
} }
} public String getData() {
+getData():type
class B { return data; +setData(type):void
public void g(){ }
ClasseNotSingleton s=new ClasseNotSingleton(); public void setData(String data){
[Link]("ref créée dans g: "+s); [Link] = data;
} }
} A B Program
public class Program { } +g():void
+f():void
public static void main(String[] args) {
ClasseNotSingleton s=new ClasseNotSingleton();
▪ Combien d’instance de de la classe S sont créées suite à l’exécution de
[Link]("ref créée dans main: "+s);
A a =new A(); ce code source?
a.f();
▪ Modifier le code source de manière à ce que une seule instance de
B b=new B();
b.g();
ClasseNotSingleton soit créé et qui peut servir à la classe A, B et
} Program
} ▪ Comment procéder?
Mise en œuvre d’un Singleton (1/3)
ClasseSingleton class ClasseSingleton { Class A
private String data="une data";
private ClasseSingleton(){ Public void f(){
- instance: ClasseSingleton } ClasseSingleton s=new ClasseSingleton();
- data: type public String getData() { }
return data;
} Class B
- ClasseSingleton() public void setData(String data){
[Link] = data; Public void g(){
+getInstance(): ClasseSingleton } ClasseSingleton s=new ClasseSingleton();
+Operations():type }
public ClasseSingleton getInstance(){
Class Program
}
Public static void void main(Stirnt T[]){
A B Program ClasseSingleton s=new ClasseSingleton();
}
}
+f():void +f():void
▪ Compléter le code source de getInstance() afin de garantir qu’une seule instance de instance soit créée
Mise en œuvre d’un Singleton (2/3)
ClasseSingleton class ClasseSingleton { Class A
private static ClasseSingleton
instance; public void f(){
- instance: ClasseSingleton private String data="une data"; ClasseSingleton obj=[Link]()
}
- data: type private ClasseSingleton(){
}
public String getData() { Class B
- ClasseSingleton() return data; public void f(){
}
+getInstance(): ClasseSingleton public void setData(String data){
ClasseSingleton obj=[Link]()
}
+Operations():type [Link] = data;
}public static ClasseSingleton
getInstance() {
if (instance == null) Class Program
instance = new ClasseSingleton();
return instance; public static void void main(Stirnt T[]){
A B Program } ClasseSingleton obj=[Link]()
}
+f():void +f():void
}
▪ Compléter le code de manière à prendre le cas d’accès concurrent à la mémoire: synchronization
Mise en œuvre d’un Singleton (3/3)
class ClasseSingleton {
ClasseSingleton private static ClasseSingleton
instance;
- instance: ClasseSingleton private String data="une data";
- data: type private ClasseSingleton(){
}
public String getData() { public static ClasseSingleton
- ClasseSingleton() return data; getInstance() {
} if (instance == null) {
+getInstance(): ClasseSingleton public void setData(String data){ synchronized ([Link]) {
+Operations():type [Link] = data; if (instance == null) {
}public static ClasseSingleton instance = new ClasseSingleton();
getInstance() {
}
if (instance == null)
instance = new ClasseSingleton();
}
return instance; }
A B Program } return instance;
}
+f():void +f():void
}
▪ Ce code source utilise la technique de Double-Checked Locking
Quelques cas d’utilisation du design pattern singleton (1)
▪ Gestion des ressources partagées : Code
▪ une ressource partagée unique, comme: client 1
Connection DB
▪ Connexion à une base de données Code
client 1
▪ un gestionnaire de fichiers
…
▪ etc.
▪ Le design pattern singleton garantit qu'une seule instance de cette DataBaseConnection
ressource et elle est utilisée à travers toute l'application.
- instance: DataBaseConnection
▪ Ainsi, la connection est unique dans toute l’application: partie en - connection: Connection
bleue
- DataBaseConnection()
▪ Ceci évite le serveur de créer plusieurs connections (problème +getInstance(): DataBaseConnection
mémoire) +Operations():type
ProgUser1
Connexion
Instance 1
ProgUser2
Instance 2
Instance 3
ProgUser3
Utiliser le Singleton
ProgUser1
Connexion
ProgUser3
NB. selon la taille de l’application, le singleton de connexion peut présenter des limites
Accès aux bases de données: utiliser le design pattern Singleton (1/2)
package part2.chap9.design_patterns.singleton.example2;
import [Link];
import [Link]; public static DataBaseConnection getInstance() {
import [Link]; if (instance == null) {
public class DataBaseConnection { synchronized ([Link]) {
private static DataBaseConnection instance; if (instance == null) { instance = new
private Connection connection = null; DataBaseConnection();}
} getInstance
private DataBaseConnection() { }
String url = "jdbc:mysql://localhost:3306/store"; return instance;
String user = "root"; }
String password = ""; Constructeur privé: Operations
Il initialise la connection public Connection getConnection() {
try { return connection;
connection = [Link](url, user, password); }
} catch (SQLException e) { [Link]();}
}
}
Accès aux bases de données: utiliser le design pattern Singleton (2/2)
package part2.chap9.design_patterns.singleton.example2;
import [Link];
import [Link];
import [Link];
import [Link];
public class Program {
public static void main(String[] args) {
DataBaseConnection dbConnection=[Link]();
Connection connection =[Link]();
String sql="select * from product where price>?";
try {
PreparedStatement prst=[Link](sql);
[Link](1, 1000);//les produits dont le prix >200
ResultSet rs=[Link]();
while([Link]()){
[Link]([Link]("designation")+ " "+[Link]("price"));
}
} catch (SQLException e) {
[Link]();
}
}
}
Accès aux bases de données: Limites du design pattern Singleton
▪ Peut devenir un goulot d'étranglement si l'application nécessite de Code
nombreuses connexions simultanées. client 1
▪ La connexion unique peut entraîner des problèmes de performance Connection DB
Code
et de scalabilité
client 1
▪ Rend le code moins flexible et plus difficile à tester, notamment en
raison de la difficulté de mocker une instance Singleton dans les
tests unitaires.
Alternatives
1. Pool de Connexions: gérer un ensemble de connexions réutilisables, améliorant ainsi la performance et la
scalabilité
2. Injection de Dépendances: améliorer la flexibilité et la testabilité et permet de remplacer facilement les
dépendances
3. Framework-Managed Connections: Hibernate, Sprind Data
Quelques cas d’utilisation du design pattern singleton (2)
▪ Informations de configuration : Code
▪ Un objet ayant ces informations est unique pour toute l’application, client 1
comme: Config File
Code
▪ Paramétrage du stock client 1
…
▪ Le design pattern singleton garantit qu'une seule instance de cet
objet de configuration utilisée à travers toute l'application.
ConfigStock
▪ Ainsi, les informations de configurations sont uniques dans toute
- instance: ConfigStock
l’application: partie en bleue
- yearOfStock: int
- tva: double
- ConfigStock()
+getInstance(): ConfigStock
+Operations():type
Product Program
-name:String OtherProgram …
-price:double
+methode():type
Quelques cas d’utilisation du design pattern singleton (2)
Soit le code source suivant de la classe ConfigStock
public class ConfigStock { Code
private int yarOfStock; client 1
private double tva=0.2; Config File
public void printConfig(){ Code
[Link]("Year:"+yarOfStock); client 1
[Link]("Tva:"+tva); …
}
}
ConfigStock
Questions: - instance: ConfigStock
1. Pourquoi ce code ne permet pas d’avoir la même configuration dans - yearOfStock: int
toute l’application? - tva: double
2. Modifier ce code afin d’assurer la création d’une seule configuration
dans toute l’application? - ConfigStock()
+getInstance(): ConfigStock
+Operations():type
Product Program
-name:String OtherProgram …
-price:double
+methode():type
Exercice - Singleton
Développer une application pour la gestion de la bourse.
1. L'application doit permettre de gérer les cours des actions, les transactions, et les paramètres de configuration de la bourse.
▪ Le code de cette partie est supposé donné
2. L’application doit garantir qu'il n'existe qu'une seule instance de la configuration de la bourse à travers l'application.
▪ Le programme principale créé une instance de la configuration et l’initialise
▪ La classe Other imprime la même configuration avec sa méthode Print
La configuration se trouve dans la classe MarketConfiguration et concerne les données suivantes :
Market Market Name: Global Action Exchange
Opening Time: 08:00
Closing Time: 18:00 Other
Transaction
* +print():void
Action +buyAction(string name, double price): void
-name:String +sellAction(String name):void
-price:double
MarketConfiguration
marketName: String
Program openingTime: String
Questions closingTime: String
1. Pourquoi cette modélisation n’assure pas la création d’une seule configuration
• Analyser le code source de Program +printConfig():void
2. Faire les modifications nécessaires afin d’assurer la création d’une seule
configuration
Le programme principal est:
public class Program { Résultat du programme:
public static void main(String[] args) {
[Link]("Config..."); Config main..
MarketConfiguration config = new Market : Global Action Exchange
MarketConfiguration("Global Action Exchange","08:00","18:00"); Opening Time: 08:00
[Link](); Closing Time: 18:00
// Gestion des transactions Gestion des transactions------
[Link]("Gestion des transactions--"); Acheter des actions
Transaction transaction = new Transaction(); achat action: AWS au prix: 150.0
// Acheter des actions achat action: GOOGLE au prix: 2800.0
[Link]("Acheter des actions"); liste des actions:
[Link]("AWS", 150.00); Action: AWS, Prix: 150.0
[Link]("GOOGLE", 2800.00); Action: GOOGLE, Prix: 2800.0
// Lister les actions achetées Vente de aws
[Link](); Vente action: AWS au prix: 150.0
// Vendre une action liste des actions:
[Link]("Vente de aws"); Action: GOOGLE, Prix: 2800.0
[Link]("AWS"); Config other..
// Lister les actions après vente Market : Global Action Exchange
[Link](); Opening Time: 08:00
[Link]("other..."); Closing Time: 18:00
Other other=new Other();
[Link]();
}
}
Le design pattern Singleton en data science
▪ Dans de nombreuses applications de data science (ex. prédiction, scoring, NLP...), il est
souvent nécessaire de charger un modèle entraîné en mémoire (fichier .model, .pkl, etc.).
▪ Or, ce modèle peut être coûteux à charger, donc on souhaite qu’une seule instance soit
créée et utilisée dans toute l’application.
JAVA – Implémentation des principaux
design patterns
1. À quoi servent les design patterns
2. Types de design patterns
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
DAO ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
ProductDAO
DataBaseConnection
<<singleton>>
Sans Dao ( code source 1/3)
public class DataBaseConnection { Product
private static DataBaseConnection instance; <<entity>>
private Connection connection = null; -id:long
private DataBaseConnection() { -designation:String
String url = "jdbc:mysql://localhost:3306/store"; -price:double
String user = "root";
String password = "";
try {
connection = [Link](url, user, password);
} catch (SQLException e) {[Link]();}
App2 App1
}
public Connection getConnection() {return connection;}
public static DataBaseConnection getInstance() {
if (instance == null) {
synchronized ([Link]) {
if (instance == null) { DataBaseConnection
instance = new DataBaseConnection(); <<singleton>>
}
}
}
return instance;
}
}
Sans Dao (code source 2/3)
public class App1 { Product
static List<Product> getAllProducts() { <<entity>>
DataBaseConnection dbConnection = [Link]();
Connection connection = [Link]();
-id:long
List<Product> products = new ArrayList<>(); -designation:String
String sql = "select * from product"; -price:double
try {
PreparedStatement prst = [Link](sql);
ResultSet rs = [Link]();
while ([Link]()) {
[Link](new Product([Link]("id"), App2 App1
[Link]("designation"), [Link]("price")));
}
} catch (SQLException e) {[Link]();}
return products;
}
public static void main(String[] args) { DataBaseConnection
List<Product> products=getAllProducts();
for(Product p:products)
<<singleton>>
[Link](p);
}
}
Sans Dao (code source 3/3)
public class App2 { Product
static List<Product> getAllProducts() { <<entity>>
DataBaseConnection dbConnection = [Link]();
Connection connection = [Link]();
-id:long
List<Product> products = new ArrayList<>(); -designation:String
String sql = "select * from product"; -price:double
try {
PreparedStatement prst = [Link](sql);
ResultSet rs = [Link]();
while ([Link]()) {
[Link](new Product([Link]("id"), App2 App1
[Link]("designation"), [Link]("price")));
}
} catch (SQLException e) {[Link]();}
return products;
}
public static void main(String[] args) { DataBaseConnection
List<Product> products=getAllProducts();
for(Product p:products)
<<singleton>>
[Link](p);
}
}
ProductDao
<<interface>>
+addProduct(Product product):void
+deleteProduct(long id):void
+getOneProduct(long id):Product
+getAll():List< Product >
+getByKeyWord(String keyword):List<Produit>
ProductDaoImpl Business /
Presentaton
Layer
DataBaseConnection
<<singleton>>
Design pattern DAO: code source (1/4) Product
<<entity>>
public class DataBaseConnection { -id:long
private static DataBaseConnection instance; -designation:String
private Connection connection = null; -price:double
private DataBaseConnection() {
String url = "jdbc:mysql://localhost:3306/store";
String user = "root";
String password = "";
ProductDao
try {
<<interface>>
connection = [Link](url, user, password);
} catch (SQLException e) {[Link]();} +addProduct(Product product):void
} +deleteProduct(long id):void
public Connection getConnection() {return connection;} +getOneProduct(long id):Product
public static DataBaseConnection getInstance() { +getAll():List< Product >
if (instance == null) { +getByKeyWord(String keyword):List<Produit>
synchronized ([Link]) {
if (instance == null) {
instance = new DataBaseConnection();
}
} ProductDaoImpl
} Business /
Presentaton
return instance;
Layer
}
}
DataBaseConnection
<<singleton>>
Design pattern DAO: code source (2/4) Product
<<entity>>
public class Product { -id:long
private long id; -designation:String
private String designation; -price:double
private double price;
public Product(long id, String designation, double price) {
[Link] = id;
[Link] = designation;
ProductDao
[Link] = price;
<<interface>>
}
//getters & setters +addProduct(Product product):void
@Override +deleteProduct(long id):void
public String toString() { +getOneProduct(long id):Product
return "Product [id=" + id + ", designation=" + designation + ", price=" + price + "]"; +getAll():List< Product >
} +getByKeyWord(String keyword):List<Produit>
}
DataBaseConnection
<<singleton>>
Design pattern DAO: code source (3/4) Product
<<entity>>
@Override -id:long
public List<Product> getByKeyWord(String key) { -designation:String
List<Product> products = new ArrayList<>(); -price:double
String sql = "select * from product where designation like ?";
try {
PreparedStatement prst = [Link](sql);
[Link](1, "%"+key+"%");
ResultSet rs = [Link](); ProductDao
while ([Link]()) { <<interface>>
[Link](new Product([Link]("id"), [Link]("designation"),
[Link]("price"))); +addProduct(Product product):void
} +deleteProduct(long id):void
} catch (SQLException e) { +getOneProduct(long id):Product
+getAll():List< Product >
[Link]();
+getByKeyWord(String keyword):List<Produit>
}
return products;
ProductDaoImpl Business /
Presentaton
Layer
DataBaseConnection
<<singleton>>
Design pattern DAO: code source (4/4) Product
<<entity>>
public class Program { -id:long
public static void main(String[] args) { -designation:String
ProductDAO pdao=new ProductDAOImpl(); -price:double
[Link]("add:");
[Link](new Product(0,"Chemise Titi",150));
[Link]("getById:");
Product p=[Link](113); ProductDao
<<interface>>
[Link](p);
[Link]("getAllByKey:"); +addProduct(Product product):void
List<Product> products=[Link]("Chemise"); +deleteProduct(long id):void
for(Product pr:products) +getOneProduct(long id):Product
[Link](pr); +getAll():List< Product >
+getByKeyWord(String keyword):List<Produit>
}
}
ProductDaoImpl Business /
Presentaton
Layer
DataBaseConnection
<<singleton>>
Design pattern DAO: code source (4/4) client
<<entity>>
-id:long
-firstName:String
-lastName:String
-[Link]
-email:String
ClientDao
<<interface>>
+addClient(Client client):void
+deleteClient(long id):void
+getOneClient(long id):Client
+getAll():List< Client >
+getByKeyWord(String keyword):List<Client>
ClientDaoImpl Business /
Presentaton
Layer
DataBaseConnection
<<singleton>>
POO- JAVA: Présentation et Implémentation de
Dao design pattern
Exercice
Ajouter le module gestion des clients qui permet la manipulation de la table client de la même
base de données en utilisant Dao Design pattern
JAVA – Implémentation des principaux
design patterns
1. À quoi servent les design patterns
2. Types de design patterns
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
Abstract DAO ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
ProductDaoImpl Business /
Presentaton
Layer
DataBaseConnection
AbstractDao <<singleton>>
Le design pattern Abstract Dao: à quoi peut servir?
GenericDao<T>
User Product
<<interface>>
-id:long +add(T obj):void -id:long
-login:String +delete(long id):void -designation:String
-password:String +getOne(long id):T -price:double
+getAll():List<T>
UserDao ProductDao
Business / <<interface>> <<interface>>
Presentaton
+getUser(String login, String password): User +getByKeyWord(String keyword):List<Produit>
Layer User
Ajouter le module gestion des clients qui permet la manipulation de la table client de la même
base de données en utilisant Abstract Dao Design pattern
Le design pattern Abstract DAO en data science
▪ dans un projet de Data Science appliqué et déployé, où l'on gère des volumes de données et
des résultats à stocker durablement, le pattern DAO structure le code, isole les
responsabilités et rend le système évolutif.
▪ Stocke dans une base de données :
▪ Les données d'entraînement,
▪ Les résultats de prédictions,
▪ Les métriques d’évaluation du modèle.
JAVA – Implémentation des principaux
design patterns
1. À quoi servent les design patterns
2. Types de design patterns
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
Decorator ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
ConcreteDecorator
Objet de
base Objet
décoré
Repas{abstract} Couscous
Carotte
sauce
Viande
Ognon Courgette
raisinSec Big courgette rouge
… …
+getCout():double {abstract}
+getDescription():String {abstract} Tajine
Olive
Citron
Courgette
RaisinSec
Carotte
▪ Créer un objet de base Tajine Couscous Sauce
▪ Puis le décorer par autres objets
Viande
Ognon
Résultat de l’exécution:
Couscous + sauce+ carotte+ courgette+ viande Courgette
Price:80.0 RaisinSec
Olive
Citron
POO- JAVA: Présentation et Implémentation de
Decorator Design Pattern
Exercice 1:
Vous travaillez pour une agence de voyages qui souhaite développer un système de gestion de packages
touristiques.
Le système doit permettre d'ajouter dynamiquement des options supplémentaires aux packages de base sans
modifier leur code de base. Un package de base est un séjour avec un nombre de nuits. Le prix à la nuit est à gérer.
Chaque option doit modifier le coût et la description du package.
Exemples d’options: visites guidées, des repas, des assurances voyage, etc.
Travail demandé:
1. Proposer le modèle sous forme d’un diagramme de classes
2. Donner une implémentation
3. Tester votre code source:
▪ Créer un package de base
▪ Ajouter autres packages
▪ Afficher la description finale du package: description + prix
Le design pattern Decorator en data science
1. Dans le Pipeline de transformations de données (Data preprocessing):
▪ Souvent, on doit appliquer plusieurs traitements successifs à des datasets (extraction de features, normalisation,
nettoyage, encodage, etc.).
▪ Avec le pattern Decorator, on peut enchaîner dynamiquement des transformations sans modifier les classes de
base.
▪ Chaque étape ajoute une « couche » de traitement en décorant la précédente.
Par exemple, dans des frameworks ML ou personnalisés, chaque préprocesseur est un décorateur qui ajoute sa
fonction à la chaîne.
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
Composit ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
Section11 titre
contenu titre
Section12 section121
contenu
titre
Chapitre2
Section13
section131
section112
…
Sans Composite design pattern: Model 1
1..*
Livre Chapitre
titre titre
Contenu contenu
operations()
operations()
▪ Modèle pour représenter le contenu d’un livre 1..*
▪ Le contenu est hiérarchique
Section
▪ Chaque niveau est géré de la même logique que son ascendant Titre
▪ Problèmes: contenu
operations()
▪ Le nombre de niveaux est fixe!!
▪ Tous les livres issus de ce modèle doivent avoir le même *
nombre de niveaux SousSection
▪ Beaucoup d’objets à gérer Titre
contenu
▪ Difficulté de maintenance du code
operations()
▪ Difficulté d’évolution
Avec Composite design pattern: Model 2
Composant{abstract}
#titre Composite
#contenu
+add(Composant):void
#niveau
+remove(Composant):void
* 1 +getComposants():List<Composant
+Composant(String,String,int)
+operation():void{abstract} >
fils parent
+getMarge():String
Feuille
Livre
Java en action
Ce livre… Classe-objet classe
… …
Chapitre 1
section111
objet
section112
Principaux concepts de POO …
les concepts de la POO...
Chapitre2
Section13
…
section132
…
Quand utiliser le pattern composite
▪ Si on s'aperçoit qu’on utilise plusieurs objets de la même manière et
qu'ils ont souvent un code presque identique pour les manipuler, le
composite est un bon choix.
Livre
Java en action
Ce livre… Classe-objet classe
… …
Chapitre 1
section111
objet
section112
Principaux concepts de POO …
les concepts de la POO...
Chapitre2
Section13
…
section132
…
Exemple d’utilisation : structure d’un livre (Code 1/2)
Vous êtes chargé de développer un système pour gérer l'organisation d'une école. Cette
organisation comprend des départements, des filières, des niveaux d'étude, des modules, des
professeurs et des étudiants. Vous allez utiliser le design pattern Composite pour traiter ces
entités de manière uniforme.
Objectif
Implémenter les classes nécessaires pour représenter l'organisation de l'école en utilisant le
design pattern Composite.
Permettre de calculer le nombre total de modules, de professeurs et d'étudiants dans une
structure donnée (département, filière, niveau d'étude, etc.).
Permettre d'afficher la structure de l'école de manière hiérarchique.
JAVA – Implémentation des principaux
design patterns
1. À quoi servent les design patterns
2. Types de design patterns
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
Strategy ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
Vous travaillez dans une banque et vous devez développer un système de calcul de crédits
bancaires. La banque propose différents types de crédits (prêt personnel, prêt immobilier, prêt
auto, etc.) et chacun a sa propre méthode de calcul des intérêts.
Objectif
Proposer un programme Java pour calculer les intérêts pour chaque type de crédit.
Pour résoudre ce problème, une première réflexion peut avoir la forme suivante:
Sans Strategy design Pattern
LoanCalculator
+calculateInterest(loanType: String, principal: double, rate: double, years : int): double
public class LoanCalculator { Class Program{
public double calculateInterest(String loanType, double public static void main(String[] args) {
principal, double rate, int years) { LoanCalculator calculator = new LoanCalculator();
Vous travaillez sur une plateforme de commerce électronique qui doit permettre aux utilisateurs de payer leurs
achats en ligne en utilisant différentes méthodes de paiement telles que les cartes de crédit, PayPal, et les
virements bancaires. Vous devez implémenter le design pattern Strategy pour gérer ces différentes méthodes de
paiement de manière flexible et évolutive.
Pour résoudre ce problème, vous allez utiliser le design pattern Strategy afin de pouvoir choisir dynamiquement la
stratégie de paiement.
Objectif
1. Implémenter les classes nécessaires pour représenter les différents types de paiement en utilisant le design
pattern Strategy.
2. Permettre de réaliser le paiement en se basant sur le détail de chaque paiement. (voir les classes ci-dessous)
3. S’assurer que le système soit facilement extensible pour ajouter de nouvelles méthodes de paiement à l'avenir.
Virement CreditCardPayment PaypalPayment
-rib: String -cardNumber: String -emal: String
-expiryDate: String -passWord: String
-cvv: String
Strategy design Pattern – java code
// Implementation 1 // Interface Strategy
class CreditCardPayment implements PaymentStrategy { interface PaymentStrategy { ShoppingCart {context}
private String cardNumber; void pay(int amount);
private String expiryDate; private String cvv; }
+checkout(double amount):void
public CreditCardPayment(String cardNumber, String
expiryDate, String cvv) {
[Link] = cardNumber;
[Link] = expiryDate; [Link] = cvv; Program
}
1
@Override
public void pay(int amount) { PaymentStrategy
[Link](amount + " paid with credit <<interface>>
card");
} +pay(double amount): void
}
// Implementation 2
class PaypalPayment implements PaymentStrategy {
private String email; private String password;
public PaypalPayment(String email, String password) {
[Link] = email; [Link] = password;
} CreditCardPayment PaypalPayment
-cardNumber: String -emal: String
@Override
-expiryDate: String -passWord: String
public void pay(int amount) {
[Link](amount + " paid using Paypal"); -cvv: String
}
}
Strategy design Pattern – java code
// Context
class ShoppingCart { ShoppingCart {context}
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
+checkout(double amount):void
[Link] = paymentStrategy;
}
public void checkout(int amount) { Program
[Link](amount);
} 1
} PaymentStrategy
// Example usage <<interface>>
public class Main { +pay(double amount): void
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
ENSA Oujda
3. Les principaux design patterns
Cycle d’ingénieur - DSCC 1ère Année
▪ Singleton Design Pattern
▪ Dao Design Pattern
POO en java ▪ Abstract Dao Design Pattern
▪ Decorator Design Pattern
Implémentation de ▪ Composit Design Pattern
Observer ▪ Strategy Design Pattern
▪
Design Pattern Observer Design Pattern
// Exemple d'utilisation
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();