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 :

Intérêt d'une factory versus un new


Sujet :

C++

  1. #1
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut Intérêt d'une factory versus un new
    Bonjour,

    Je suis en train d'étudier l'utilisation des dessign patterns ...

    J'ai une question par rapport aux factories.

    En fait je voudrais savoir les avantages et les inconvenients d'utiliser des factories, pourquoi utiliser une factory à la place d'un simple "new" d'une classe, dans quels cas les utiliser ...

    Merci !!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    La factory, c'est un new virtuel.
    Avec une factory, pas besoin de connaître la classe, il suffit d'avoir un pointeur vers ladite factory...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    La factory, c'est un new virtuel.
    Avec une factory, pas besoin de connaître la classe, il suffit d'avoir un pointeur vers ladite factory...
    Exactement. Si ton code est écrit pour une interface (la fabrique, classe abstraite), il fonctionnera pour toute nouvelle classe qui dérive de celle ci par polymorphisme.
    Lorsque ton code utilise plein de classes concrètes, tu devras modifier ce code à chaque ajout de nouvelles classes concrètes. Ce qui ne respecte pas le principe "ouvert - fermé".
    En fournissant un pointeur vers une fabrique, tu te gardes bien d'instancier directement une classe abstraite.

    -> cf http://come-david.developpez.com/tut...?page=sommaire

  4. #4
    Invité
    Invité(e)
    Par défaut
    Il y a aussi d'autres avantages secondaires: une fonction factory peut changer de type de produit ou initialiser le produit différemment en fonction, par exemple, d'une option de la ligne de commande ou d'une valeur de configuration. Elle peut également accumuler des statistiques sur les créations d'objet, etc..

    Carl

  5. #5
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut
    Merci de vos reponses qui m'ont éclairé assez .

    Maintenant je me pose une question ...

    Comment ça se passe au niveau de la destruction des objets générés par une factory ? C'est au client de la factory de les desallouer ou bien la destruction est encapsullée ?

    Dans l'exemple du tutoriel des factories de developpez.com (http://come-david.developpez.com/tut...Fabrique#LIV-2)... il ne faudrait pas desallouer quelque part les objects qui sont crées ?

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Généralement la factory est une source de données, et le client obtient la responsabilité de déclencher la libération.
    Toutefois si la factory renvoie un handle/pointeur intelligent plutôt qu'un pointeur, alors la libération peut être implicite (et déterministe)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Je sais que des boost::XXX_ptr voire sdt::auto_ptr serait mieux en terme de gestion de mémoire.Mais les premier impose d'utiliser boost et les 2eme sont assez fourbe quand on les passe à une fonction.
    D'où mon choix d'utiliser des pointeurs en dur.

    donkeyquote : Sinon rien n'empeche la factory de garder une trace des objet qu'elle à créée, puis de les détruire sur demande.
    Mais pour moi, une factory créer des objets, elle ne gère pas leur cycle de vie.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  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
    Citation Envoyé par Davidbrcz Voir le message
    Je sais que des boost::XXX_ptr voire sdt::auto_ptr serait mieux en terme de gestion de mémoire.Mais les premier impose d'utiliser boost et les 2eme sont assez fourbe quand on les passe à une fonction.
    Si tu utilises un compilateur assez récent, implémentant TR1, shared_ptr et consorts sont inclus de base avec.
    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
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Hum, je savais que TR1 était incluse par un certain nombre de compilos, mais je pense ce n'est pas encore assez répandu.
    Pour moi, pas de problème (g++ 4.2.3) mais est ce le cas de VC++ 6.0 qui est malheureusement encore assez utilisé et même des versions supérieures de VC.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    La seule fourberie de std::auto_ptr que je connaisse, c'est de l'utiliser comme membre avec un destructeur inline.

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    tu as déjà passé un std::auto_ptr à une fonction ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    À une fonction puit. Oui.
    C'est même un artéfact très parlant sur le plan sémantique. Bien plus qu'une fonction qui prend un pointeur et dont il faut regarder le code pour savoir ce qu'elle en fait.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pour ceux qui ne savent pas ou ont oublié, on a ça dans la FAQ C++ : http://cpp.developpez.com/faq/cpp/?p...NTEURS_autoptr

    D'où en effet, comme l'a dit Luc, il faut savoir si la fonction sait qu'elle devient propriétaire selon le type de passage en argument, et dans ce cas si elle agit correctement, ne laissant aucune erreur se profiler.

  14. #14
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    A partir du moment où l'on sait que le concept de l'auto_ptr est basé sur la propriété du pointeur et que les copies/assignations ont pour effet le transfer de propriété, on est pas surprit.

    J'avais lu ça, je ne connaissait pas l'équivalent français, fonction puit :

    The transfer of ownership implies a special use for auto_ptrs; that is, functions can use them to transfer ownership to other functions. This can occur in two different ways:

    • A function can behave as a sink of data. This happens if an auto_ptr is passed as an argument to the function by value. In this case, the parameter of the called function gets ownership of the auto_ptr. Thus, if the function does not transfer it again, the object gets deleted on function exit:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       void sink(std::auto_ptr<ClassA>);       //sink() gets ownership
    • A function can behave as a source of data. When an auto_ptr is returned, ownership of the returned value gets transferred to the calling function. The following example shows this technique:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       std::auto_ptr<ClassA> f()
       {
           std:: auto_ptr<ClassA> ptr(new ClassA); //ptr owns the new object
           ...
           return ptr;         //transfer ownership to calling function
       }
    A noter que l'on peut empêcher le transfer de propriété des auto_ptr en les déclarant const. Cela n'interdit pas d'accéder en lecture écriture à la donnée pointée.

  15. #15
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Dans XC++ de Sutter, donc dans GOTW, il y a un item sur std::auto_ptr, et ça cause de puits/sources si mes souvenirs sont bons, si ça t'intéresse.

    EDIT : c'est http://gotw.ca/gotw/025.htm

  16. #16
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    J'avais lu ça, je ne connaissait pas l'équivalent français, fonction puit :
    Je ne saurais garantir que c'est LE équivalent français. C'est la traduction qui me parait la plus naturelle, bien que sink ait un sens légèrement différent.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Alp Voir le message
    Dans XC++ de Sutter, donc dans GOTW, il y a un item sur std::auto_ptr, et ça cause de puits/sources si mes souvenirs sont bons, si ça t'intéresse.

    EDIT : c'est http://gotw.ca/gotw/025.htm
    carrément merci

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    La seule fourberie de std::auto_ptr que je connaisse, c'est de l'utiliser comme membre avec un destructeur inline.
    Précisons que le problème, ou plutôt la condition à l'usage de auto_ptr<T> est que le type T doit être complet pour instancier le destructeur auto_ptr<T>::~auto_ptr(), ce qui limite l'usage d'auto_ptr pour implémenter un pimpl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    X.hpp : 
    
    class X {
    	class impl; // type incomplet selon le principe du pimpl
    	std::auto_ptr<impl> pimpl;
    
    public:
    	~X () {}
    	// ici, instancie auto_ptr<impl>::~auto_ptr ()
    	// erreur : 
    	// impl est incomplet ici, delete d'un impl* indéfini
    };
    alternative qui n'est pas mieux :

    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
    X2.hpp : 
    
    class X2 {
    	class impl;
    	std::auto_ptr<impl> pimpl;
    
    public:
    	// ~X2 () déclaré implicitement (ok)
    };
    
    toto.cpp : 
    
    #include "X2.hpp"
    
    X2 x;
    // ~X2 () est est défini implicitement ici, erreur : 
    // instancie auto_ptr<X2::impl>::~auto_ptr ()
    // X2::impl est incomplet ici, delete d'un X2::impl* indéfini
    la solution :

    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
    X3.hpp : 
    
    class X3 {
    	class impl;
    	std::auto_ptr<impl> pimpl;
    
    public:
    	~X3 ();
    };
    
    X3.cpp : 
    
    #include "X3.hpp"
    
    class X3::impl { 
    	// selon le principe du pimpl, on définit ici le mécanisme interne de X3
    	...
    };
    
    X3::~X3 () {}
    // instancie auto_ptr<X3::impl>::~auto_ptr ()
    // ok: X3::impl est complet ici

Discussions similaires

  1. Connection à une BDD avec un new mdw
    Par electrosat03 dans le forum Sécurité
    Réponses: 3
    Dernier message: 19/01/2007, 11h23
  2. Intérêt d'une classe abstraite
    Par sandytarit dans le forum Langage
    Réponses: 6
    Dernier message: 21/11/2006, 14h41
  3. intérêt d'une solution
    Par FamiDoo dans le forum MFC
    Réponses: 5
    Dernier message: 13/06/2006, 11h10
  4. [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

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