SINGLETON
G.L Avancés
Lundi 07 Décembre 2015
Anouar MABROUK
Imen BOUHDIDA
Réalisé par :
Sommaire
- Problème
- Solution
- Impact sur la conception
- Exemple d'implémentation
- Conclusion
Vendredi 30 Janvier 2015
Description du problème
Context.py
G.L Avancés
Lundi 07 Décembre 2015
- Des classes qui doivent être instanciées une seule et unique fois
Problème
Exemple :
Une classe qui implémenterait un pilote pour une imprimante. Instancier deux fois cette classe
Surcharge inutile du système + Comportements incohérents.
La solution ?
Context.py
G.L Avancés
Lundi 07 Décembre 2015
SINGLETON
Solution
- Patron de Conception (Design pattern)
- Il fait partie des modèles de création.
- Permet de s'assurer qu'il n'existe qu'une unique instance d'une classe donnée.
La classe elle-même est responsable de l'unicité de son instance.
instance
Client1
Client2
Client3
Singleton
Requêtes



Impact sur la conception
Context.py
G.L Avancés
Lundi 07 Décembre 2015
- Déclarer private tous les constructeurs de la classe.
- Déclarer une méthode statique qui retournera un objet correspondant au type de la classe (getInstance)
Impact sur la conception

Exemple
d'implémentation
en JAVA
Context.py
G.L Avancés
Lundi 07 Décembre 2015
- Afin de mettre en pratique le pattern Singleton en Java, prenons un court exemple d’implémentation dans le milieu bancaire.
Exemple d'implEmentation en java
- Une classe CompteBancaire qui permet de déposer ou retirer de l’argent sur un compte.
- Une classe distincte nommée Journalisation reprenant le pattern Singleton
- Une troisième classe intitulée Main permettra d’exécuter l’application et d’obtenir un résultat en console.
Context.py
G.L Avancés
Lundi 07 Décembre 2015
- On remarque que la classe Journalisation est basée sur le pattern Singleton. En effet, on trouve un attribut statique de type Singleton, un constructeur déclaré en private et une méthode statique servant de pseudo-constructeur. Il existe aussi deux méthodes propres à l’utilisation de cette classe que sont ajouterLog(string) et afficherLog().
Exemple d'implEmentation en java

IMPLÉMENTATION DE LA CLASSE JOURNALISATION
// Classe basée sur le pattern Singleton qui permet la journalisation de l'application.
public class Journalisation
{
private static Journalisation uniqueInstance;// Stockage de l'unique instance de cette classe.
private String log;// Chaine de caractères représentant les messages de log.
// Constructeur en privé (donc inaccessible à l'extérieur de la classe).
private Journalisation()
{
log = new String();
}
// Méthode statique qui sert de pseudo-constructeur
public static synchronized Journalisation getInstance()
{
if(uniqueInstance==null)
{
uniqueInstance = new Journalisation();
}
return uniqueInstance;
}
// Méthode qui permet d'ajouter un message de log.
public void ajouterLog(String log)
{
// On ajoute également la date du message.
Date d = new Date();
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy HH'h'mm");
this.log+="["+dateFormat.format(d)+"] "+log+"\n";
}
// Méthode qui retourne tous les messages de log.
public String afficherLog()
{
return log;
}
}IMPLÉMENTATION DE LA CLASSE CompteBancaire
// Classe représentant un compte bancaire simpliste.
public class CompteBancaire
{
private int numero;// Numéro du compte.
private double solde;// Argent disponible sur le compte.
// Constructeur d'un CompteBancaire à partir de son numéro.
public CompteBancaire(int numero)
{
this.numero=numero;
this.solde=0.0;
}
// Méthode qui permet de déposer de l'argent sur le compte.
public void deposerArgent(double depot)
{
if(depot>0.0)
{
solde+=depot;// On ajoute la somme déposée au solde.
Journalisation.getInstance().ajouterLog("Dépôt de "+depot+"Dt sur le compte "+numero+".");
}
else
{
Journalisation.getInstance().ajouterLog("/!\\ Dépôt d'une valeur négative impossible ("+numero+").");
}
}
// Méthode qui permet de retirer de l'argent sur le compte.
public void retirerArgent(double retrait)
{
if(retrait>0.0)
{
if(solde>=retrait)
{
solde-=retrait;// On retranche la somme retirée au solde.
Journalisation.getInstance().ajouterLog("Retrait de "+retrait+"Dt sur le compte "+numero+".");
}
else
{
Journalisation.getInstance().ajouterLog("/!\\ La banque n'autorise pas de découvert ("+numero+").");
}
}
else
{
Journalisation.getInstance().ajouterLog("/!\\ Rerait d'une valeur négative impossible ("+numero+").");
}
}
}IMPLÉMENTATION DE LA CLASSE Main
// Classe principale de l'application.
public class Main
{
// Méthode principale.
public static void main(String[] args)
{
// Création et utilisation du CompteBancaire cb1.
CompteBancaire cb1 = new CompteBancaire(1);
cb1.deposerArgent(100);
cb1.retirerArgent(80);
// Création et utilisation du CompteBancaire cb2.
CompteBancaire cb2 = new CompteBancaire(2);
cb2.retirerArgent(10);
// Affichage des logs en console.
String s = Journalisation.getInstance().afficherLog();
System.out.println(s);
}
}[30/04/07 13h46] Dépôt de 100.0 Dt sur le compte 1.
[30/04/07 13h46] Retrait de 80.0 Dt sur le compte 1.
[30/04/07 13h46] /!\ La banque n'autorise pas de découvert (2).Résultat en console
Conclusion
Context.py
G.L Avancés
Lundi 07 Décembre 2015
- Nous avons présenté ici le motif de conception Singleton qui permet de répondre à la problématique de n'avoir qu'une seule et même instance d'une classe.
- L'implémentation d'une telle structure est très rapide et simple à mettre en place. Il est possible par exemple de l'implémenter pour gérer la connexion au serveur de bases de données, le contexte de votre application, l'aire de jeux d'un jeu vidéo...
Conclusion

Copy of Web openfx - Demo Presentation
By Anouar Mabrouk
Copy of Web openfx - Demo Presentation
This is the demo of the Web open Fx project, a plateform for ofx plugins made by students from the IMAC engineering school http://www.ingenieur-imac.fr/
- 531