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

C++ Discussion :

Quel design pattern pour un garage composé de voitures.


Sujet :

C++

  1. #1
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut Quel design pattern pour un garage composé de voitures.
    Bonjour à tous,
    j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Garage
    {
         // des trucs
       public:
         Voiture * creeVoiture();
         // des trucs
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Voiture
    {
         // des trucs
       public:
         // des trucs
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Ferrari : public Voiture
    {
         // des trucs
       public:
         // des trucs
    };
    Je voudrais pouvoir rajouter des voitures dans mon garage juste en créeant une classe qui hérite de Voiture (comme Ferrari).
    Comment puis-je faire sachant que je veux juste que mon garage contienne toutes les voitures différentes (ie l'ensemble des voitures que je peux créer) et que garage n'est pas obligé de construire toutes les voitures ?
    Par exemple je peux avoir Ferrari et Porsche qui peuvent être construites par mon garage, mais garage ne contiendra qu'une Ferrari par exemple au début.
    Si je fais un conteneur de voitures * en static dans garage et une méthode static dans Voiture (que je dois redéfinir dans les classes filles), cela est-il correct ? Il y a mieux ?
    J'aimerais aussi savoir si cela se rapproche d'un design pattern, si oui lequel.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne comprend pas trop où tu veux en venir. Déjà, j'ai du mal à voir pourquoi Ferrari serait une classe dérivée de voiture. Qu'est-ce qu'une Ferrari a qui fait que ce n'est pas simplement une voiture ?

    A part ça, le design pattern qui me vient en tête quand on parle de création d'objet est avant tout le pattern Factory. Mais n'ayant pas compris ton besoin, je ne sais s'il s'applique ici.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ce n'est pas ton garage qui construiot des voitures, tu devrais bien séparer le garage - stockage - de la construction - pattern Builder ou Factory -

  4. #4
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Je suis d'accord, j'ai besoin d'une classe qui construit mes voitures.
    Pour le garage, je dois suivre une interface qui comprend créerVoiture().
    Donc si je suis obligé d'avoir creerVoiture dans ma classe garage, il serait mieux que je crée une classe Factory qui se charge d'implémenter la création d'une voiture et creerVoiture() de ma classe garage devra appeler la méthode de constrution de ma Factory.

    Ce que je voudrais c'est que mon garage contiennent différentes voitures et que la méthode de ma Factory construise aléatoirement des voitures.
    Pour rajouter une voiture, je voudrais simplement ajouter quelques classes.
    Par exemple pour Ferrari, admettons que j'ai créer une Enzo, pour peugeot une 206.
    Ma factory devra contruire par exemple 10 voitures : 7 Enzo, et 3 206 (les chiffres seront tirés aléatoirement).
    Maintenant je veux rajouter une Porsche 911, je crée une classe et là je voudrais que ma classe Factory puisse la créer sans changer la méthode de création.
    Si c'est toujours pas clair dites le moi.

    Citation Envoyé par JolyLoic
    Déjà, j'ai du mal à voir pourquoi Ferrari serait une classe dérivée de voiture. Qu'est-ce qu'une Ferrari a qui fait que ce n'est pas simplement une voiture ?
    Tu ferais une instance de voiture que tu appelerais Ferrari, c'est bien ça ?
    Je vois, en fait j'avais dans l'idée de faire dérivée chaque nouvelle voiture de la classe voiture. Mais apparemment ça n'a pas l'air très bien, si ?


    Merci d'avance.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par b Oo
    Tu ferais une instance de voiture que tu appelerais Ferrari, c'est bien ça ?
    Je vois, en fait j'avais dans l'idée de faire dérivée chaque nouvelle voiture de la classe voiture. Mais apparemment ça n'a pas l'air très bien, si ?
    Ca dépend ce que tu veux en faire... Mais dans ce que j'ai vu actuellement de ton code, rien ne semble le justifier. J'ai bien aimé l'article suivant sur le sujet :
    http://archive.eiffel.com/doc/manual...T/inh-m6fs.pdf
    (paragraphe 24.4).

  6. #6
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Merci pour l'article JolyLoic.

    Sinon pour problème.
    Il faudrait que je fasse un membre static qui contient des Voitures * dans ma fabrique et que chaque nouvelle classe (qui hérite de Voiture) soit rajoutée dans la fabrique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Fabrique
    {
          static vector<Voiture *> v;
       public :
          Voiture * creeVoiture(); // cree une voiture aleatoirement
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Fille : public Voiture
    {
       public:
        static ajouterVoiture(); // la voiture Fille peut etre cosntruite par ma fabrique
    };
    Si je procede de cette maniere, cela est-il correct ?
    Je rappelle que je ne veux pas modifier le code de ma fabrique.

    Merci.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Commence par de ne pas retourner des pointeurs bruts comme ça.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Tu as un vecteur d'objets (d'ailleurs, pourquoi statique ? Tu ne peux pas avoir des garages différents ? Si tel est le cas, ne serait-ce pas à garage d'être un singleton ?) dans ta classe, et j'ai l'impression que ce que tu voudrais, conceptuellement, c'est une vecteur de classes, ce qui n'existe pas directement en C++.

    Les deux solutions qui me viennent en tête sont :
    - Avoir un vecteur de pointeur de fonctions qui pointent sur des fonctions de création d'objets (c'est assez classique pour implémenter une factory)
    - Avoir un vecteur d'objets qui servent de prototype (comme le design pattern du même nom) et qui se clonent à le demande pour créer un nouvel objet (j'ai moins l'habitude, mais certains langages objets n'ayant pas la notion de classe fonctionnent uniquement comme ça).

    Dans le premier cas, je verrais bien pour ton garage une interface genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Garage
    {
      typedef Vehicle *(*VehicleCreator)();
      void registerVehicle(string const &name, VehicleCreator creator);
      Vehicle *create(string const &name);
    private:
      map<string, VehicleCreator> myCreators;
    };
    Charge aux véhicules de s'enregistrer auprès du garage. Evidemment, pour du vrai code, j'utiliserais probablement des pointeurs intelligents et des boost::function<Vehicle*()>, mais l'idée est là.

  9. #9
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Ok, merci JolyLoic, je vais essayer la deuxième solution.
    Mon Garage n'est pas un singleton, mais les 2 garages qui heritent de Garage oui. (Garage me sert juste d'interface).

    Citation Envoyé par loufoque
    Commence par de ne pas retourner des pointeurs bruts comme ça.
    C'est pour eviter d'oublier une désallocation ?
    Si tu as le temps, j'aimerais que tu développes un peu plus.

    Merci encore.

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, c'est pour éviter les fuites mémoires, utilise des pointeurs intelligents, par exemple -> http://miles.developpez.com/tutoriel...ost/smartptrs/

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

Discussions similaires

  1. Quel design pattern pour ce que je veux faire
    Par yvon_huynh dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2015, 16h45
  2. Réponses: 0
    Dernier message: 18/03/2011, 16h10
  3. [Débutant] Quel design pattern choisir pour le J2EE ?
    Par ghost10 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 06/11/2010, 09h31
  4. Réponses: 5
    Dernier message: 21/06/2006, 14h47
  5. Quel design pattern pour réaliser une synthèse
    Par jbwan dans le forum Design Patterns
    Réponses: 3
    Dernier message: 21/04/2006, 12h39

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