IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Serieux probleme de conception


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Par défaut Serieux probleme de conception
    Bonjour a tous!
    J'ai un serieux probleme de conception:
    Je souhaiterai integrer le pattern du singleton à une classe abstraite, dans la mesure où les classes qui heriterons seraient elles aussi à instance unique.

    Plus globalement: Je souhaiterai definir une architecture de classe tels que chaque classe qui deriverai de la classe mere aurait la possibilitée de s'instancier une unique fois.

    Bon, j'ai beau tourner et retourner le probleme, j'ai l'impression d'etre confronté a un blocage niveau langage.
    J'ai pensé à utiliser une classe "Factory" qui verifierai et limiterai les instances, mais en vain.

    Je commence meme a me dire que c'est mon idée de base qui a un probleme de conception (ce qui me rassurerait... )

    Donc, a tous des developpeurs qui ne font pas que pisser du code et qui aurait une reponse pour un curieux... Je suis preneur!

  2. #2
    Membre émérite
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Par défaut
    Je ne sais pas si tu as cherché très longtemps

    http://smeric.developpez.com/java/uml/singleton/

  3. #3
    Membre confirmé Avatar de zoullou
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 130
    Par défaut
    Je croit que ta réponse "yolepro" ne repond pas à la question :-). Il voudrais pouvoir forcer les classes dérivant la sienne à implementer le singleton.

    Perso je ne vois pas trop comment faire. On ne peut pas forcer le constructeur à etre privé via une interface ou une classe abstraite ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Dans certaine interface, on declare des fonctions lancant des exceptions cela permet eventuellement lors de l'implementaition de celle ci de lancer l'exception comme quoi cette sous classe ne supporte pas cette fonction.
    J'espere que je suis clair.
    Je ne sais pas trop si on peut l'appliquer à ton problème mais tu pourrais faire un constructeur public qui renvoit toujours une exception... En fait je ne vois vraiment pas comment cela peut t'aider mais c'est une piste à fouiller...

  5. #5
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut
    Dans le genre 'bricolage', tu pourrais enregistrer en un unique endroit une valeur accessible par toutes les classes (ex : une variable globale ou dans un fichier ou comme tu le sens). Ensuite, dans ton constructeur tu verifie cette valeur.

    en gros, un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public MaClasse() throws UneException
    {
       if(maValeurMemoire=="deja instancié")
       {
            throw new UneException("cette classe ne peut etre instanciee qu'une seule fois");
       }
       else
       {
           maValeurMemoire="deja instancié";
           ... suite normale du constructeur
       }
    }
    bon ok je sais c'est pas propre mais ca devrait marcher et ca devrait etre facile à faire.

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Par défaut
    Justement non le probleme vient du fait qu'on peu instancier une classe avec un constructeur qui n'appelerai pas "super();", donc qui n'appelerait ce que tu viens d'ecrire pour la classe mere...

    Mon idée (meme si il reste encore des gros pb) ->
    Je pensais à une classe instanciable uniquement par une classe "usine" (factory), qui permettrai de controler les instances, comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    //Dans SingletonFactory.java
     
    import java.lang.reflection;
     
    Class SingletonFactory
    {
       //
      Singleton Initialize(Class toInstanciate)
      {
     
        //On verifie que 'toInstanciate' est bien derivé de Singleton    
     
        Class c = toInstanciate.getSuperClass();    
        boolean isDerived = false;
     
        while (c!=null);
        {
          if(c.equals(Singleton.class))
          { isDerived = true; break; }
         c = c.getSuperClass();
        }
     
        //On verifie le nombre d'instance de la classe 
     
        //... C'EST LA QUE JE SAIS PAS FAIRE :-/
     
        //Si oui on instancie avec le constructeur par defaut
        object = c.newInstance();    
     
        return c;
    }
     
     
    //Dans Singleton.java
    abstract class Singleton
    {
      protected Singleton()
      {}
     
      abstract void methode1();
      abstract int methode2();
      //etc...
    }

  7. #7
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Exemple avec une classe mère Singleton et une classe fille SingletonChild. Seule contrainte, la classe Singleton et ses classes filles doivent être situées dans le même package (à noter quand même que la visibilité du constructeur n'est plus private mais package private, avec les risques que cela implique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public class Singleton {
        public static Singleton getInstance() {
            if (null == instance) {
                instance = new Singleton();
            }
            return instance;
        }
     
        Singleton() {
        }
     
        public String getSingletonName() {
            return "Singleton";
        }
        private static Singleton instance;
     
        public static void main(String[] args) {
            System.out.println(Singleton.getInstance().getSingletonName());
            System.out.println(SingletonChild.getInstance().getSingletonName());
        }
     
    }
    class SingletonChild extends Singleton {
        public static Singleton getInstance() {
            if (null == instance) { // Premier appel
                instance = new SingletonChild();
            }
            return instance;
        }
        public String getSingletonName() {
            return "SingletonChild";
        }
        private static Singleton instance;
     
        SingletonChild() {
        }
    }

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Par défaut
    Beaucoup trop de contraintes a mon gout , notamment les private package, etant donné que les classes derivées serait hors package dans mon application.
    Mais on approche du but (si il existe...)

    N'y a-t-il pas de methode pour savoir si un objet à deja été instancié dans le GarbageCollector?

    Les profilers le font bien, mais sont generalement codé en C... (J'ai jamais compris comment ils faisait d'ailleurs ^^

  9. #9
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Oui, trop contraignant, je suis d'accord

  10. #10
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Sinon, méthodologiquement, je ne sais pas si c'est une bonne chose de permettre la dérivation d'une classe de type singleton..
    En effet, un singleton sert en général à définir un point d'accès unique à une ressource, pour le contrôle de celle-ci. Or par dérivation, il serait possible d'accéder à cette ressource par deux singletons différents, ce qui est contraire à l'idée qu'on se fait du singleton, non :

  11. #11
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Par défaut
    Le but ici serait de creer une structure de plugins (j'appel mes classe Service...). Chaque services devrait etre unique, et actuellement j'utilise un "ServiceManager", une classe qui s'assure de l'unicitée des services.

    Cependant j'ai des petits (gros) soucis dans le cas ou un service plante:

    Chaque service possede son thread, et le ServiceManager est la pour verifier que le thread repond dans un delai imparti, que le service soit bien en l'etat "running" ou "idle", bref qu'il tourne impec'.

    Or lorsqu'un service plante, le ServiceManager le detecte, tente de stopper le thread et relance un second service par dessus... Dans la plupart des cas, le thread est supprimé, mais dans certains cas, il reste et le service reste en memoire.
    C'est problematique car justement certains services doivent avoir un acces exclusif à leurs ressources (Service de base de donnée par exemple...)
    Donc je voudrais m'assurer un unique thread par Service via un object "protected static Thread pthread", mais pour cela il faut que j'arrive à garder unique chaque service, tout en pouvant aisement developper un nouveau service avec l'architecture que je vais choisir et etre certain que le ServiceManager continue sont boulot meme si le service est tres mal codé...

    Je sais pas si je me suis bien expliqué, si ça tombe le design pattern que je veux definir existe déjà... Merci de m'eclairer!

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    J'ai peut etre mal compris mais la classe mère serait la pour forcer le fait que la sous classe soit un singleton (et faciliter son implementation, dauf que pour l'instant c'estpas le cas )donc la classe mere ne devrait posseder aucune ressource mais ces classe filles si et celles-ci, comme l'indique ta remarque, devraient etre finale, effectivement.

Discussions similaires

  1. problème de conception : cycle
    Par FarookFreeman dans le forum Diagrammes de Classes
    Réponses: 13
    Dernier message: 20/10/2005, 10h15
  2. Probleme de conception pour un update Oracle!
    Par vempiria dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/09/2005, 10h28
  3. [Language]Problème de conception
    Par lautre dans le forum Langage
    Réponses: 5
    Dernier message: 26/09/2005, 07h56
  4. [Evenement]Probleme de conception
    Par le Daoud dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 26/05/2005, 14h12
  5. probleme de conception de classe
    Par NhyMbuS dans le forum C++
    Réponses: 2
    Dernier message: 08/05/2005, 17h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo