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

Design Patterns Discussion :

Compr�hension Pattern Factory Method


Sujet :

Design Patterns

  1. #1
    Invit�
    Invit�(e)
    Par d�faut Compr�hension Pattern Factory Method
    Bonsoir,

    Il y a quelque chose que je ne saisis pas compl�tement. J'essaie de comprendre ce pattern mais rien n'y fait ..

    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
    class Createur
    {
        public :
        virtual std::string getMarque() const=0;
        friend std::ostream &operator<<(std::ostream &o,const Createur *v)
        {
            return o << v->getMarque();
        }
        static Createur *createVoiture(std::string o);
    };
            
            
            class CreateurConcretRenault : public Createur {
            public:
                std::string getMarque() const { return "Renault"; }
            };
            
            class CreateurConcretFiat : public Createur {
            public:
                std::string getMarque() const { return "Fiat"; }
            };
    
    void f(const Createur *v)
            { std::cout << "Voiture " << v << std::endl; }
            
            Createur *Createur::createVoiture(std::string o)
            {
                if(o=="fr") return new CreateurConcretRenault();
                if(o=="it") return new CreateurConcretFiat();
                return 0;
            }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
        int main()
        {
            Createur *v=Createur::createVoiture("it");
            f(v);
        
        return 0;}
    1) En quoi dans ce code peut-on dire que la m�thode createVoiture est une m�thode de Fabrication ?
    Serait-ce parce que on ne cr�er pas directement l'objet � partir d'un new mais � partir d'une m�thode qui s'occupe de cela ?

    2)Son utilis�, c'est donc pour �tre " plus efficace " ?

    3)D'ailleurs dans le main , si on regarde bien , on ne voit plus le type concret ( on ne fait pas de new concret , du genre newRenaut,newFiat ) , serait-ce la raison ? Faire en sorte que le type concret n'apparait pas dans le main ?

    4) Derniere question : J'ai vu que certains disaient que les m�thodes statiques n'�taient pas un bon choix , et qu'il pr�f�rait cr�er un objet puis appliquer la m�thode � cette instance. Mais comment faire cela sachant qu'on ne peut pas instancier une classe abstraite en c++ ?
    Derni�re modification par Invit� ; 27/07/2013 � 01h29.

  2. #2
    R�dacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte syst�me
    Inscrit en
    D�cembre 2006
    Messages
    10 062
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Architecte syst�me
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 10 062
    Par d�faut
    Citation Envoy� par tchoumo Voir le message
    D'ailleurs dans le main , si on regarde bien , on ne voit plus le type concret ( on ne fait pas de new concret , du genre newRenaut,newFiat ) , serait-ce la raison ? Faire en sorte que le type concret n'apparait pas dans le main ?
    Oui, c'est cela. Ce pattern permet de d�coupler l'interface (type abstrait) et l'impl�mentation (type concret) d'un objet. La fabrique s'occupe de cr�er une instance "concr�te" et de la renvoyer sous forme d'interface.

    Dans ton cas, c'est m�me un pattern "Abstract Factory" car tu as aussi d�coupl� l'interface et l'impl�mentation de la fabrique. Au final, ta fonction main() ne connait que l'interface de la fabrique et l'interface de l'objet.
    ALGORITHME (n.m.): M�thode complexe de r�solution d'un probl�me simple.

  3. #3
    Invit�
    Invit�(e)
    Par d�faut
    Merci de ta r�ponse , �a m'aide beaucoup sachant que ce n'est pas toujours clair sur le net .

    Par contre je sais pas si tu as vu mon �dit, tu pourrais m'�clairer sur ma quatri�me question ( et aussi sur la raison de faire cela ? ) ?

    Du coup , tu dis que dans l'Abstract factory , on ne voit que l'interface et la fabrique de cette interface.
    Que voit-on alors dans une Factory Method ?

  4. #4
    R�dacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte syst�me
    Inscrit en
    D�cembre 2006
    Messages
    10 062
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Architecte syst�me
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 10 062
    Par d�faut
    Citation Envoy� par tchoumo Voir le message
    Merci de ta r�ponse , �a m'aide beaucoup sachant que ce n'est pas toujours clair sur le net .

    Par contre je sais pas si tu as vu mon �dit, tu pourrais m'�clairer sur ma quatri�me question ( et aussi sur la raison de faire cela ? ) ?
    Si on utilise une m�thode non-statique, il faut forc�ment instancier la classe de la fabrique. Donc on se retrouve coupl� avec la classe concr�te de la fabrique.

    Si on veut absolument conserver le d�couplage de l'abstract factory, il faudrait instancier cette factory "avant", et passer son interface en argument de la fonction main().

    Du coup , tu dis que dans l'Abstract factory , on ne voit que l'interface et la fabrique de cette interface.
    Que voit-on alors dans une Factory Method ?
    une Factory Method ce n'est pas un vrai pattern de conception. C'est une m�thode qui cr�e une instance de classe et renvoie son interface.

    C'est du d�couplage de "code", mais pas du d�couplage de "conception".
    ALGORITHME (n.m.): M�thode complexe de r�solution d'un probl�me simple.

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Raa je sais que je suis dur mais je n'ai toujours pas certaines r�ponses qui me bloque ..

    1) Quand tu dis que c'est une Abstract Factory du fait que j'ai d�coupl� l'interface et l'impl�mentation de la fabrique , c'est parce qu'on sait seulement que avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Createur *v=Createur::createVoiture("it");
    cela retourne un objet dont on ne connait pas le type concret mais l'on connait seulement son interface ?

    Du coup , qu'est ce qu'il y aurait de plus pour qu'elle ne soit plus Abstract mais Factory tout court ?

    2) L'utilit� final tu dis est d'impl�menter l'interface et l'impl�mentation. Mais je ne vois toujours pas l'utilis� ? A quoi bon ?

  6. #6
    R�dacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte syst�me
    Inscrit en
    D�cembre 2006
    Messages
    10 062
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Architecte syst�me
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 10 062
    Par d�faut
    Citation Envoy� par tchoumo Voir le message
    Raa je sais que je suis dur mais je n'ai toujours pas certaines r�ponses qui me bloque ..

    1) Quand tu dis que c'est une Abstract Factory du fait que j'ai d�coupl� l'interface et l'impl�mentation de la fabrique , c'est parce qu'on sait seulement que avec
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Createur *v=Createur::createVoiture("it");
    cela retourne un objet dont on ne connait pas le type concret mais l'on connait seulement son interface ?

    Du coup , qu'est ce qu'il y aurait de plus pour qu'elle ne soit plus Abstract mais Factory tout court ?
    hum... je vais essayer de simplifier ton exemple, car tes noms de classe sont un peu ambigus.

    Code C++ : 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
    main() {
      /* couplage interface / Implémentation */
      Voiture *v = new RenaultMegane();
      f(v);
    }
     
    main() {
      /* factory */
      Renault *renault = new Renault();
      Voiture *v = renault->createMegane();
      f(v);
    }
     
    main() {
      /* abstract factory */
      Constructeur *constructeur = new Renault();
      Voiture *v = constructeur->createVoiture("Megane");
      f(v);
    }


    2) L'utilit� final tu dis est d'impl�menter l'interface et l'impl�mentation. Mais je ne vois toujours pas l'utilis� ? A quoi bon ?
    En reprenant mon exemple, ca permet de facilement cr�er de nouvelles classes concr�tes sans trop impacter le code existant.

    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    main() {
      Constructeur *constructeur = new Mandataire("Renault", "Dacia", "Peugeot", "Citroen");
      Voiture *v = constructeur->createVoiture("Megane");
      f(v);
    }
    ALGORITHME (n.m.): M�thode complexe de r�solution d'un probl�me simple.

  7. #7
    Invit�
    Invit�(e)
    Par d�faut
    Tu es d'accord avec moi concernant Abstract Factory que ( selon mon premier exemple ) :

    -On veut pouvoir cr�er des objets de diff�rents types mais appartenant � une
    m�me � famille �.
    ->C'est ce que l'on fait avec createVoiture qui elle , cr�e des objets de diff�rents types d'une m�me famille ( voitureA , voitureB .. )

    -La cr�ation doit pouvoir se faire au travers d'une seule et m�me classe (une usine de meuble abstraite)

    -Les objets peuvent �tre cr��s par diff�rentes classes (par exemple des usines des usines concr�tes) qui chacune peuvent produire plusieurs types d'objets de la famille
    -> �a c'est par exemple classe Createur , puis sous classe Voiture1,Voiture2 , puis encore sous classe Voiture1_modeleA,voiture1_modeleB etc .. ?

    Les objets doivent pouvoir �tre manipul�s sans que l'on ait besoin de savoir quelle classe (usine) les a cr��s
    -> Hum ? C.A.D ?
    Derni�re modification par Invit� ; 27/07/2013 � 04h12.

  8. #8
    R�dacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte syst�me
    Inscrit en
    D�cembre 2006
    Messages
    10 062
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 52
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Architecte syst�me
    Secteur : Industrie

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 10 062
    Par d�faut
    Citation Envoy� par tchoumo Voir le message
    Tu es d'accord avec moi concernant Abstract Factory que ( selon mon premier exemple ) :

    -On veut pouvoir cr�er des objets de diff�rents types mais appartenant � une
    m�me � famille �.
    ->C'est ce que l'on fait avec createVoiture qui elle , cr�e des objets de diff�rents types d'une m�me famille ( voitureA , voitureB .. )
    Cette caract�ristique n'est pas obligatoire pour une fabrique. On peut avoir une fabrique qui instancie toujours la m�me classe concr�te, ou alors qui instancie des classes concr�tes diff�rentes.

    -La cr�ation doit pouvoir se faire au travers d'une seule et m�me classe (une usine de meuble abstraite)
    Oui. C'est la caract�ristique particuli�re d'une fabrique abstraite.

    -Les objets peuvent �tre cr��s par diff�rentes classes (par exemple des usines des usines concr�tes) qui chacune peuvent produire plusieurs types d'objets de la famille
    -> �a c'est par exemple classe Createur , puis sous classe Voiture1,Voiture2 , puis encore sous classe Voiture1_modeleA,voiture1_modeleB etc .. ?
    Idem, cette caract�ristique n'est pas obligatoire pour une fabrique abstraite. Mais c'est tout de m�me l'int�ret d'utiliser ce pattern.

    Les objets doivent pouvoir �tre manipul�s sans que l'on ait besoin de savoir quelle classe (usine) les a cr��s
    -> Hum ? C.A.D ?
    Oui. C'est la caract�ristique g�n�rale d'une fabrique: elle renvoie une interface de l'objet, et pas son type concret.
    ALGORITHME (n.m.): M�thode complexe de r�solution d'un probl�me simple.

  9. #9
    Invit�
    Invit�(e)
    Par d�faut
    Merci beaucoup, je comprends mieux tes exemples surtout la Abstract Factory qui elle ne montre que des interfaces.

    Thanks you so much !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [Fabrique] [Java] Design Pattern Factory
    Par SkyBioSS dans le forum Design Patterns
    R�ponses: 3
    Dernier message: 24/05/2006, 14h53
  2. R�ponses: 11
    Dernier message: 03/05/2006, 15h12
  3. Spring et factory-method
    Par dehbi dans le forum Spring
    R�ponses: 3
    Dernier message: 31/03/2006, 16h00
  4. factory method
    Par mencaglia dans le forum C++
    R�ponses: 2
    Dernier message: 31/01/2006, 09h02
  5. [GOF] Abstract Factory vs Factory Method
    Par Greybird dans le forum Design Patterns
    R�ponses: 3
    Dernier message: 10/06/2005, 22h42

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