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 confirm� 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
    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
    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.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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 confirm� 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
    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
    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).
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Membre confirm� 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
    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
    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
    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�.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  9. #9
    Membre confirm� 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
    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 : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    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