SINGLETON

G.L Avancés

Lundi 07 Décembre 2015

Anouar MABROUK
Imen BOUHDIDA

Réalisé par :

Sommaire

 

  1. Problème
  2. Solution 
  3. Impact sur la conception
  4. Exemple d'implémentation
  5. 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

  1. Une classe CompteBancaire qui permet de déposer ou retirer de l’argent sur un compte.
  2. Une classe distincte nommée Journalisation reprenant le pattern Singleton
  3. 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