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

avec Java Discussion :

Factory Patern et hashset


Sujet :

avec Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut Factory Patern et hashset
    Bonjour à tous,
    j'ai modifier mon code pour utiliser les factory patern.
    Ce factory me renvoie une personne, dans laquel je rentre des attributs (numeronational, nom, prenom, fonction).
    Lorsque je lis les attributs qui viennent d'être rentré avec un (System.out.print()); les attributs sont bien compléter.
    Mon problème est que lorsque je veux mettre ma personne dans un hashset, tout ces attributs sont à null et donc, impossible de rentrer une deuxième personne, puisque pour ma hashset, il s'agit de doublon.
    Je dirais que le problème se situe aux lignes 68, 80,91,103 de ma classe IntroDonneesSaveBin, je ne suis pas certain de la syntax à utiliser.
    A savoir, que avant l'utilisation d'un factory, mon hashset fonctionnait.

    Class abstraite Personnes
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    package be.iepscfjemelle.poolabo.nicolay.entreprise2withFactory;
     
    import java.io.Serializable;
    import java.util.Objects;
     
    /**
     * Classe abstraite de l'objet Personnes, contenant les attributs d'une personnes.
     * 
     * @author Fred
     */
    public abstract class Personnes implements  Serializable {
     
        // ***********************   Attributs  ***************************************
        /**
         * Numero national de la personne
         */
        public String numeroNational;
        /**
         * Prénom de la personne
         */
        public String prenom;
        /**
         * Nom de la personne
         */
        public String nom;
        /**
         * Fonction de la personne
         */
        public String fonction;
     
        // ***********************  Constructeurs ***************************************
        /**
         * Constructeur avec paramètres
         *
         * @param numeroNational
         * @param prenom
         * @param nom
         * @param fonction
         */
        public Personnes(String numeroNational, String prenom, String nom, String fonction) {
            this.numeroNational = numeroNational;
            this.prenom = prenom;
            this.nom = nom;
            this.fonction = fonction;
        }
     
        /**
         * Constructeur par défaut
         */
        public Personnes() {
        }
     
        // *********************** Getters and setters *********************************
        /**
         * Getters and Setters commun à toutes les classes
         * @return
         */
        public String getNumeroNational() {
            return numeroNational;
        }
     
        public void setNumeroNational(String numeroNational) {
            this.numeroNational = numeroNational;
        }
     
        public String getPrenom() {
            return prenom;
        }
     
        public void setPrenom(String prenom) {
            this.prenom = prenom;
        }
     
        public String getNom() {
            return nom;
        }
     
        public void setNom(String nom) {
            this.nom = nom;
        }
     
        public String getFonction() {
            return fonction;
        }
     
        public void setFonction(String fonction) {
            this.fonction = fonction;
        }
     
    //******************************* Méthodes ******************************************
        /**
         * Méthodes Overridé
         */
     
        public abstract void joue();
     
     
        public abstract void manger();
     
        /**
         * Méthode hashCode pour mon hashset
         * @return 
         */
        @Override
        public int hashCode() {
            int hash = 3;
            hash = 61 * hash + Objects.hashCode(this.nom);
            return hash;
        }
     
        /**
         * Méthode equals pour mon hashset
         * @param obj
         * @return 
         */
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }      
            final Personnes other = (Personnes) obj;
            return Objects.equals(this.nom, other.nom);
        }    
    }
    Classe Directeur
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    package be.iepscfjemelle.poolabo.nicolay.entreprise2withFactory;
     
    import java.io.Serializable;
     
    /**
     * Classe d'objet directeur, qui hérite de l'objet personnes (interface et abstrait)
     * 
     * @author Fred
     */
    public class Directeur extends Personnes implements Serializable{
        // ***********************  Attributs ***************************************
        /**
         * Attributs spécifique au Directeur
         */
        public String portefeuille = "Ca frôle l'indécence!";;
        //public String fonction = "Directeur";
     
        // ***********************  Constructeurs ***************************************
        /**
         * Constructeur par défaut
         */
        public Directeur() {
        }
     
        /**
         * Constructeur utiliser dans la classe IntroDonneesSaveBin pour remplir les attibuts de l'objet directeur.
         * @param numeroNational
         * @param prenom
         * @param nom
         * @param fonction 
         */
        public Directeur(String numeroNational, String prenom, String nom, String fonction) {
            super(numeroNational, prenom, nom, fonction);
        }
     
        //******************************* Getters and setters ********************************************
        /**
         * Getters and Setters propore à cette Classe
         * @return
         */
        public String getPortefeuille() {
            return portefeuille;
        }
     
        public void setPortefeuille(String portefeuille) {
            this.portefeuille = portefeuille;
        }
     
        //******************************* Méthodes ******************************************
        /**
         * Méthodes à overrider
         */
        @Override
        public void joue() {
            System.out.println("Joue au golf.");     
        }
     
        @Override
        public void manger() {
        System.out.println("Mange au restaurant."); 
        }
     
        /**
         * Mise en forme de mon affichage
         * @return 
         */
        @Override
        public String toString() {
            return "Numéro National: " + this.numeroNational + ", Prénom: " + this.prenom + 
                    ", Nom: " + this.nom + ", Fonction: " + this.fonction + ", Portefeuille: " + this.portefeuille 
                    + ", Job description: Dirige la société.";
        } 
    }
    Classe Comptable
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    package be.iepscfjemelle.poolabo.nicolay.entreprise2withFactory;
     
    import java.io.Serializable;
     
    /**
     * Classe d'objet comptable, qui hérite de l'objet personnes (interface et abstrait)
     * 
     * @author Fred
     */
    public class Comptable extends Personnes implements Serializable{
     
        // ***********************  Attributs ***************************************
        /**
         * Attributs spécifique au Comptable
         */
     
     
        // ***********************  Constructeurs ***************************************
        /**
         * Constructeur avec paramètres
         *
         * @param numeroNational
         * @param prenom
         * @param nom
         * @param fonction
         */
        public Comptable(String numeroNational, String prenom, String nom, String fonction) {
            super(numeroNational, prenom, nom, fonction);
        }
     
        /**
         * Constructeur par défaut
         */
        public Comptable() {
        }
     
        //******************************** Getters and setters *******************************************
     
     
        //******************************* Méthodes ******************************************
        /**
         * Méthodes à overrider
         */
        @Override
        public void joue() {
            System.out.println("Joue au tennis.");    
        }
     
        @Override
        public void manger() {
        System.out.println("Mange au restaurant avec le directeur."); 
        }
     
        /**
         * Mise en forme de mon affichage
         * @return 
         */
        @Override
        public String toString() {
            return "Numéro National: " + this.numeroNational + ", Prénom: " + this.prenom + 
                    ", Nom: " + this.nom + ", Fonction: " + this.fonction + ", Job description: s'occupe de la facturation.";
        }   
    }
    Mes class Secretaire et comptable sont comparable aux class Directeur et comptable.

    Class PersonnesFactory
    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
     
    package be.iepscfjemelle.poolabo.nicolay.entreprise2withFactory;
     
    /**
     *
     * @author Fred
     */
    public class PersonnesFactory {
     
        static Personnes getPers(String numeroNational, String prenom, String nom, String fonction) {
            if (fonction == null) {
                return null;
            }
            if (fonction.equalsIgnoreCase("DIRECTEUR")) {
                return new Directeur();
            } else if (fonction.equalsIgnoreCase("COMPTABLE")) {
                return new Comptable();
            } else if (fonction.equalsIgnoreCase("SECRETAIRE")) {
                return new Secretaire();
            } else if (fonction.equalsIgnoreCase("OUVRIER")) {
                return new Ouvrier();
            }
            return null;
        }
    }
    Ma classe qui sert à créer des objet Personnes, remplir leurs attribut, les sérialiser et les copier dans un fichier binaire.

    class IntroDonneesSaveBin
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
     
    package be.iepscfjemelle.poolabo.nicolay.entreprise2withFactory;
     
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    /**
     * Classe héritant de l'interface Prog, qui à partir d'un menu secondaire, crée
     * des objets Personnes et leurs attributs, (fonctions d'après un hashmap).
     * Places ces objets Personnes dans un hashset, pour éviter les doublons.
     * Ensuite, parcours le hashset, sérialise chaque ojets et l'enregistre dans un
     * fichier binaire. Propose un retour au menu principal à la fin.
     *
     * @author Fred
     */
    public class IntroDonneesSaveBin implements Prog {
     
        /**
         * Methode qui remplis mon hashset et les attributs de chaques employés
         *
         */
        @Override
        public void execute(MenuDepart programme) {
            //Création d'une haspMap qui définira la fonction d'un objet
            HashMap<Integer, String> mesFonctions = new HashMap<>();
            // Insertion des valeurs dans la hashmap
            mesFonctions.put(1, "Directeur");
            mesFonctions.put(2, "Comptable");
            mesFonctions.put(3, "Secretaire");
            mesFonctions.put(4, "Ouvrier");
     
            // Création d'un hashSet d'objets Personnes
            HashSet<Personnes> hset = new HashSet<>();
     
            ObjectOutputStream sortie = null;
     
            int nbr = nombreEmploye();//nombre d'employé dans l'entreprise pour définir le nombre de boucles
            //PersonnesFactory persFactory = new PersonnesFactory();
     
            for (int i = 0; i < nbr; i++) {
                int choix = menuFonction();//Appel de ma méthode MenuFonction    
                //Lecture des données de chaque employé dans la console pour remplir les attributs de chaque objet Personnes
                System.out.println("Entrer les informations demandée sur l'employé:  ");
                System.out.print("Numéro National: ");
                String numeroNational = Clavier.lireString();
                System.out.print("Prénom: ");
                String prenom = Clavier.lireString();
                System.out.print("Nom: ");
                String nom = Clavier.lireString();
                System.out.println("Fonction: " + mesFonctions.get(choix));
                String fonction = mesFonctions.get(choix);
                System.out.println("\n");
                //Switch pour remplir les attributs d'une classe en fonction du choix fait avant           
                switch (choix) {
                    case 0:
                        System.exit(0);
                        break;
                    case 1:
                        Directeur directeur = (Directeur) PersonnesFactory.getPers(numeroNational, prenom, nom, fonction);
                        System.out.println(numeroNational + prenom + nom + fonction);
                        if (hset.add(directeur)) {
                        } else {
                            System.out.println("Cet employé occupe déjà une fonction dans l'entreprise.\n");
                            System.out.println("Veuillez rentrer à nouveau les informations sur l'employé.\n");
                            i--;
                        }
                        //i = ajoutPersonneToList(directeur, hset)? i : i-1;//appel la méthode ajoutPersonne ToList avec ternaire                 
                        System.out.println("\n");
                        break;
                    case 2:
                        Comptable comptable = (Comptable) PersonnesFactory.getPers(numeroNational, prenom, nom, fonction);
                        System.out.println(numeroNational + prenom + nom + fonction);
                        if (hset.add(comptable)) {
                        } else {
                            System.out.println("Cet employé occupe déjà une fonction dans l'entreprise.\n");
                            System.out.println("Veuillez rentrer à nouveau les informations sur l'employé.\n");
                            i--;
                        }
                        //i = ajoutPersonneToList(comptable, hset) ? i : i - 1;//appel la méthode ajoutPersonne ToList avec ternaire                  
                        System.out.println("\n");
                        break;
                    case 3:
                        Secretaire secretaire = (Secretaire) PersonnesFactory.getPers(numeroNational, prenom, nom, fonction);
                        if (hset.add(secretaire)) {
                        } else {
                            System.out.println("Cet employé occupe déjà une fonction dans l'entreprise.\n");
                            System.out.println("Veuillez rentrer à nouveau les informations sur l'employé.\n");
                            i--;
                        }
                        //i = ajoutPersonneToList(secretaire, hset) ? i : i - 1;//appel la méthode ajoutPersonne ToList avec ternaire                
     
                        System.out.println("\n");
                        break;
                    case 4:
                        Ouvrier ouvrier = (Ouvrier) PersonnesFactory.getPers(numeroNational, prenom, nom, fonction);
                        if (hset.add(ouvrier)) {
                        } else {
                            System.out.println("Cet employé occupe déjà une fonction dans l'entreprise.\n");
                            System.out.println("Veuillez rentrer à nouveau les informations sur l'employé.\n");
                            i--;
                        }
                        //i = ajoutPersonneToList(ouvrier, hset) ? i : i - 1;//appel la méthode ajoutPersonne ToList avec ternaire                   
                        System.out.println("\n");
                        break;
                    case 5:
                        programme.showMenuDépart();
                    default:
                        this.menuFonction();
                }
            }
     
            try {
                saveDataHset(hset);//appel de ma méthode saveDataHset
            } catch (IOException ex) {
                Logger.getLogger(IntroDonneesSaveBin.class.getName()).log(Level.SEVERE, null, ex);
            }
     
            this.endProg(programme);//appel de la méthode fin de programme
        }
     
        //****************************************Méthodes*****************************************************  
        /**
         * Méthode avec condition ajout de l'objet, si le nom existe déjà, msg
         * erreur et demande à nouveau les attributs du nouvel employé.
         *
         * @param pers
         * @param hset
         * @return
         */
        /*private boolean ajoutPersonneToList(Personnes pers, HashSet<Personnes> hset) {
            if (hset.add(pers)) {
                return true;
            } else {
                System.out.println("Cet employé occupe déjà une fonction dans l'entreprise.\n");
                System.out.println("Veuillez rentrer à nouveau les informations sur l'employé.\n");
                return false;
            }
        }*/
     
        /**
         * Méthode qui parcour mon hashset via un itérateur et encode mes objets
         * Personnes dans un fichier binaire
         *
         * @param hs
         * @throws FileNotFoundException
         * @throws IOException
         */
        public static void saveDataHset(HashSet<Personnes> hs) throws FileNotFoundException, IOException {
            // Création d'un itérateur
            Iterator<Personnes> iter = hs.iterator();
            ObjectOutputStream sortie = new ObjectOutputStream(new FileOutputStream("fichier.dat"));
            // Boucle tant qu'il y a un objet dans le hashset
            while (iter.hasNext()) {
                Personnes empl = iter.next();
                sortie.writeObject(empl);
            }
            System.out.println();
        }
     
        /**
         * Fin du programme, retour au menu principale
         *
         * @param programme
         */
        @Override
        public void endProg(MenuDepart programme) {
            System.out.println("Appuyer sur une touche pour retourner au menu.");
            String str = Clavier.lireString();
            programme.showMenuDépart();
        }
     
        /**
         * Méthode pour choisir la fonction, quitter ou retour au menu principale
         *
         * @return
         */
        private int menuFonction() {
            System.out.println("Veuillez choisir un chiffre dans la liste ci-dessous: ");
            System.out.println("0  ==> Quitter");
            System.out.println("1  ==> Directeur");
            System.out.println("2  ==> Comptable");
            System.out.println("3  ==> Secretaire");
            System.out.println("4  ==> Ouvrier");
            System.out.println("5  ==> Retour au menu de départ");
            System.out.print("Votre choix: ");
            int choix;
            choix = (Clavier.lireInt());
            return choix;
        }
     
        /**
         * Méthode pour choisir le nombre d'employé et renvoyé un int
         *
         * @return
         */
        private int nombreEmploye() {
            int taille;
            System.out.print("Entrer le nombre d'employé dans l'entreprise: ");
            taille = Clavier.lireInt();
            return taille;
        }
    }

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    De ce que je vois de ta classe factory, elle n'assigne pas de valeurs aux proprietes de Personnes mais appelle seulement son constructeur sans argument (par exemple ligne 15 pour un object de type Directeur).
    Les valeurs prenom, nom, numeroNational ne sont donc pas utilisees.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Voici le code corrigé, je ne renvoyais pas les attributs lors de la création de mes objets (Directeur, Comptable, etc...) dans mon factory.

    PersonnesFactory
    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
     
    package be.iepscfjemelle.poolabo.nicolay.entreprise2withFactory;
     
    /**
     *
     * @author Fred
     */
    public class PersonnesFactory {
     
        static Personnes getPers(String numeroNational, String prenom, String nom, String fonction) {
            if (fonction == null) {
                return null;
            }
            if (fonction.equalsIgnoreCase("DIRECTEUR")) {      
                return new Directeur(numeroNational, nom, prenom, fonction);
            } else if (fonction.equalsIgnoreCase("COMPTABLE")) {
                return new Comptable(numeroNational, nom, prenom, fonction);
            } else if (fonction.equalsIgnoreCase("SECRETAIRE")) {
                return new Secretaire(numeroNational, nom, prenom, fonction);
            } else if (fonction.equalsIgnoreCase("OUVRIER")) {
                return new Ouvrier(numeroNational, nom, prenom, fonction);
            }
            return null;
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interet du patern Factory
    Par kodo dans le forum Design Patterns
    Réponses: 1
    Dernier message: 01/03/2010, 12h04
  2. [Data Access Object]Intérêt de la factory ?
    Par le Daoud dans le forum Général Java
    Réponses: 2
    Dernier message: 21/04/2005, 09h06
  3. [Stratégie][Factory]
    Par Sancho dans le forum Général Java
    Réponses: 6
    Dernier message: 17/02/2005, 11h06
  4. [Fabrique] [Java] La "Factory" Késako ?
    Par brousaille dans le forum Design Patterns
    Réponses: 13
    Dernier message: 21/01/2005, 11h53
  5. [Conception][Factory] Packages inheritance
    Par ludovic.fernandez dans le forum Général Java
    Réponses: 5
    Dernier message: 05/07/2004, 17h02

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