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 :

Design pattern Factory et génériques


Sujet :

C#

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Design pattern Factory et génériques
    Bonjour,

    J'ai conscience que ce que je souhaite faire et un brin tordu, mais je n'ai pas trouvé de solution plus robuste.

    Le but est d'avoir une classe de base qui implémente le pattern Factory dont d'autres classes pourront hériter tout en ayant un aspect différent (page à onglet ou tree view).

    Voilà un exemple :

    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
    using Gtk;
    using System.Collections.Generic;
     
    class Factory<G, H> where G : new()
    {
        private static Factory<G, H> instance;
     
        protected Factory()
        {
        }
     
        public static Factory<G, H> get_instance()
        {
            if (instance == null)
            {
                instance = new Factory<G, H>();
            }
            return instance;
        }
    }
     
    class TreeView
    {
    }
     
    class Project
    {
    }
     
    class ProjectFactory : Factory<Gtk.TreeView, Project>
    {
    }
     
    class Test
    {
        static void Main(string[] args)
        {
            ProjectFactory factory = ProjectFactory.get_instance();
        }
    }
    Ce qui me permettrai d'avoir un gestionnaire de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class FileFactory : Factory<Gtk.Notebook, File>
    {
    }
    Sachant que les gestionnaires proposent des méthodes open, save, ... qui ne sont que appeler les méthodes des objets usinés (H.open, H.save, ...).

    Donc je souhaiterai savoir si ceci est faisable en C# (mon code ne compile pas) ou si vous avez une idée moins tordu ?

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Soit tu ne connais pas les classes abstraites, soit tu as fait une erreur dans l'utilisation du design Factory.
    Il n'est pas simple à comprendre, et on s'enmèle vite les pinceaux
    Wiki te propose une description et un exemple de code (C# et autres langages) de ce patron de conception :
    http://fr.wikipedia.org/wiki/Fabriqu...eption%29#C.23

    Si tu veux que l'on te propose une solution moins tordus peux tu nous en dire un peu plus sur ce que tu souhaites faire ?

  3. #3
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Je pense avoir compris ce que tu souhaites faire et je serai tenté de dire que oui, c'est faisable.

    Par contre, je ne suis pas convaincu que ton approche soit la plus simple...mais j'attend que tu donnes plus de précisions.

    Au passage, tu travailles en 2.0 ou en 3.5 ?

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Soit tu ne connais pas les classes abstraites, soit tu as fait une erreur dans l'utilisation du design Factory.
    Il n'est pas simple à comprendre, et on s'enmèle vite les pinceaux
    Wiki te propose une description et un exemple de code (C# et autres langages) de ce patron de conception :
    http://fr.wikipedia.org/wiki/Fabriqu...eption%29#C.23
    Beuh si j'connais les classes abstraites, c'est juste leur utilisation qui m'échappe un peu

    Effectivement mon pattern est incomplet, avec la méthode abstraite createObject ça devrait simplifier les choses

    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
    using Gtk;
    using System.Collections.Generic;
     
    class Factory<G> where G : new()
    {
        private static Factory<G> instance;
     
        protected Factory()
        {
        }
     
        public static Factory<G> get_instance()
        {
            if (instance == null)
            {
                instance = new Factory<G>();
            }
            return instance;
        }
     
        public virtual Object create_object()
        {
            return new Object();
        }
    }
     
    class Object
    {
    }
     
    class Project : Object
    {
    }
     
    class ProjectFactory : Factory<Gtk.TreeView>
    {
        public override Object create_object()
        {
            return new Project();
        }
    }
     
    class Test
    {
        static void Main(string[] args)
        {
            ProjectFactory factory = ProjectFactory.get_instance();
        }
    }
    Citation Envoyé par ced600 Voir le message
    Si tu veux que l'on te propose une solution moins tordus peux tu nous en dire un peu plus sur ce que tu souhaites faire ?
    J'ai abordé ce point dans ma question : factoriser le code de deux factory

    Plus concrètement :
    • D'un côté j'ai une classe ProjectFactory qui hérite des TreeView et qui me permet de gérer les projects d'un IDE
    • De l'autre une classe DocumentFactory qui est un Notebook et gère les fichiers

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Au passage, tu travailles en 2.0 ou en 3.5 ?
    Aucun des deux J'utilise un langage C#-like : Vala. Je pense que je peux facilement être compatible 2.0, mais au delà je ne sais pas. Par exemple il existe les fonctions lambda mais pas le mot clés where (oui, je sais je suis plutôt mal partie :/). J'ai posté ici pour savoir ce qu'il est possible de faire en C# et voir si je peux faire la même chose en Vala ou s'il faut implémenter de nouvelles fonctionnalités

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Et ça, ça ne te convient pas :
    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
    class AbstractFactory
        {
     
        }
     
        class Factory<G, H> : AbstractFactory where G : new() 
        {
            private static Factory<G, H> instance;
     
            protected Factory()
            {
            }
     
            public static Factory<G, H> get_instance()
            {
                if (instance == null)
                {
                    instance = new Factory<G, H>();
                }
                return instance;
            }
        }
     
        class TreeView
        {
        }
     
        class Project
        {
        }
     
        class ProjectFactory : Factory<TreeView, Project>
        {
        }
     
        class Test
        {
            static void Main(string[] args)
            {
                AbstractFactory factory = ProjectFactory.get_instance();
            }
        }
    C'est du C# qui compile.

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    J'ai abordé ce point dans ma question : factoriser le code de deux factory

    Plus concrètement :
    D'un côté j'ai une classe ProjectFactory qui hérite des TreeView et qui me permet de gérer les projects d'un IDE
    De l'autre une classe DocumentFactory qui est un Notebook et gère les fichiers


    Je n'ai pas compris. En plus pourquoi factoriser des factory ? Ce design pattern ne considère t il pas qu'il y a plusieurs factory ? Alors pourquoi les réduire.

    Tu es faché avec le mot clés abstract apparement. Il est indispensable d'avoir des classes abstraites pour implémenter correctement ce design pattern.

    Une classe abstraite est une classe qui propose des définitions d'arguments et de méthodes. Toutes classes héritant d'une classe abstraite est obligé overrider ces méthodes et arguments. (Sauf ce qui est déclaré comme static.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public virtual Object create_object()
        {
            return new Object();
        }


    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
     abstract class Factory<G> where G : new()
    {
         private static Factory<G> instance;
         public static Factory<G> getFactory() {
             if (instance == null)
            {
                instance = new Factory<G>();
            }
            return instance;
        }
        public abstract MyObject create_object();
     }
     
     
    abstract class MyObject ()
    {
        public abstract string MaMethode(string MaString);
    }
     
    class Project : MyObject 
    {
       public override string MaMethode(string MaString)
       {
           return "Vous avez passé ce paramètre : " + MaString + " à MaMethode";
       }
    }
     
     class ProjectFactory : Factory<Gtk.TreeView>
    {
        public override MyObject create_object()
        {
            return new Project();
        }
    }
     
     
    class Test
    {
        static void Main(string[] args)
        {
            ProjectFactory factory = ProjectFactory.getFactory();
        }
    }
    Un truc dans le genre devrait mieux marcher.

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Je n'ai pas compris. En plus pourquoi factoriser des factory ? Ce design pattern ne considère t il pas qu'il y a plusieurs factory ? Alors pourquoi les réduire.
    Peut être parce que je mélange conception et développement

    En fait j'utilise le terme factory pour deux choses :
    • Le pattern
    • Un type de classe qui s'occupe de la gestion d'une autre classe.


    Peut être qu'en utilisant le terme Manager pour le second cas, c'est plus clair ?

    En gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Factory (Pattern)
          |
          |
          V
    Manager (classe abstraite générique)
          |
          |
          V
    ProjectManager (classe finale) = Manager<Project>
    Donc jusque là, c'est plutôt simple. Le problème c'est que mon manager doit en plus hériter d'un widget graphique. Sans héritage multiple le but était de remonter l'héritage au début (donc au niveau du factory) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    widget
          |
          |
          V
    Factory (Pattern)
          |
          |
          V
    Manager (classe abstraite générique)
          |
          |
          V
    ProjectManager (classe finale) = Manager<Project>
    Et bien sur comme différent manager peuvent être représenté différemment, ça commence à devenir drôle


    Citation Envoyé par ced600 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    abstract class Factory<G> where G : new()
    {
    ...
                instance = new Factory<G>();
    ...
    Un truc dans le genre devrait mieux marcher.
    ça passe en C# ? En vala ce n'est pas possible :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't create instance of abstract class `Factory'
    ça me parait plutôt logique.

    @SaumonAgile : ça ressemble fort à de l'héritage multiple, non ?

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Bon moi je viens juste me moquer de gege il est trop tard pour que je puisse comprendre ce que tu essayes de faire

    Pis félicitations tu t'essayes enfin à un vrai langage (enfin tu essayes avec ton Vala mais c'est déjà ça ).

    Enfin si une question : pourquoi ton manager doit hériter d'un widget graphique ?

    C'est super tordu ton truc quand même.

    Et on est d'accord que c'est une fabrique abstraite que tu veux faire et pas une fabrique tout court hein ?

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    abstract fonctionne en C#, j'en ai déjà utilisé.

    J'ai l'impression que tu pars sur une mauvaise conception des choses.
    Peux tu expliquer ton projet ?

    Connais tu les interfaces ? En général on les utilise pour éviter les héritages multiples lorsque que l'on a besoin d'héritages multiples.

    mais bon beaucoup te diront que si tu as besoin d'héritage multiple c'est que la conception n'est pas bonne.

    Pour le desgin pattern factory :
    1. La
    2. La factory est une classe qui instancie des Classes.
    3. Une factory dérive d'une classe abstraite définnissant sa structure
    4. Les classes instanciées dérivent chacune d'une classe abstraite.
    5. Le client qui utilise le tout ne connais que les classes abstraites.


    Comme le dit Wiki cela permet de séparer la création d'objet de leur utilisation.

    Bref le client appelle les méthodes create des factory pour créer ses objets et ainsi récupères les instances de classes.

    Il n'aura pas à s'embêter avec le type car tout sera de type la classe abstraite.

    Je n'ai jamais trouvé l'intérêt de ce pattern du fait de sa compléxité.
    Je préfère utilisé les interfaces et un peu d'héritage à la place.


    Et on est d'accord que c'est une fabrique abstraite que tu veux faire et pas une fabrique tout court hein ?
    Ta phrase n'as pas de sens car une fabrique dérive d'une classe abstraite.
    Peux être il veut une factory générique au lieu de x factory, mais je pense que c'est s'embêter pour rien si c'est le cas. Autant faire une factory qui contient la création de tous les objets.
    D'où peut être la confusion avec une classe manager.

  11. #11
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    J'ai conscience que ce que je souhaite faire et un brin tordu, mais je n'ai pas trouvé de solution plus robuste.
    elle est tellement robuste qu'elle est inimplémentable

    Même si il me semble comprendre où tu veux en venir, j'ai quand même l'impression que tu cherches à faire entrer un pattern à tout prix là où ce n'est pas nécessaire...

    A part ça, effectivement, instancier une classe abstraite directement ce n'est pas possible en C# non plus.

    cf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    abstract class Factory<G> where G : new()
    {
    ...
                instance = new Factory<G>(); // nice try dude ^^
    ...

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    A part ça, effectivement, instancier une classe abstraite directement ce n'est pas possible en C# non plus.

    cf.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    abstract class Factory<G> where G : new()
    {
    ...
                instance = new Factory<G>(); // nice try dude ^^
    ...
    Heu.... Oui tout a fait, je n'avais pas vu que j'avais écrit cette bétise
    En plus j'ai jamais instancié mes classes abstraites !!!!!! Je vous jure des fois je me dit que j'aurais du rester couché !!!!

    Bon en faisant des modifs du code de wiki en reprenant le tiens je me suis enmélé les pinceaux

    Reprenons :
    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
     abstract class Factory<G> where G : new()
    {
         private static Factory<G> instance;
         public static Factory<G> getFactory() {
             if (instance == null)
            {
                instance = new MyFactory<G>();
            }
            return instance;
        }
        public abstract MyObject create_object();
     }
     
    //N'utilisant pas souvent les générique je ne sais pas si Class MyFactory<G> : Factory<G> where G : new() est valable.
    //Peut être plutot Class MyFactory<G> : Factory<G>
     
    Class MyFactory<G> : Factory<G> where G : new()
    {
        public override MyObject create_object()
        {
              return new MyObject();
        }
    }
     
     
    abstract class MyObject ()
    {
        public abstract string MaMethode(string MaString);
    }
     
    class Project : MyObject 
    {
       public override string MaMethode(string MaString)
       {
           return "Vous avez passé ce paramètre : " + MaString + " à MaMethode";
       }
    }
     
     class ProjectFactory : Factory<Gtk.TreeView>
    {
        public override MyObject create_object()
        {
            return new Project();
        }
    }
     
     
    class Test
    {
        static void Main(string[] args)
        {
            ProjectFactory factory = ProjectFactory.getFactory();
        }
    }

  13. #13
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par ced600 Voir le message
    Ta phrase n'as pas de sens car une fabrique dérive d'une classe abstraite.
    Je parle des 2 patterns existants : la fabrique et la fabrique abstraite.
    http://fr.wikipedia.org/wiki/Fabriqu..._conception%29
    http://fr.wikipedia.org/wiki/Fabriqu..._conception%29
    L'un utilise l'autre mais il faut quand même qu'il sache ce qu'il veut faire le ptit gege.

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par ced600 Voir le message
    J'ai l'impression que tu pars sur une mauvaise conception des choses.
    Mauvaise je sais pas, tordu c'est certain

    Bon je pense que je vais faire simple en ayant une propriété Manager::widget qui sera mon TreeView ou Notebook.


    Citation Envoyé par ced600 Voir le message
    Connais tu les interfaces ? En général on les utilise pour éviter les héritages multiples lorsque que l'on a besoin d'héritages multiples.
    Oui mais il n'est pas possible d'implémenter des fonctions dans une interface donc ça me sert à rien ici

    Citation Envoyé par ced600 Voir le message
    mais bon beaucoup te diront que si tu as besoin d'héritage multiple c'est que la conception n'est pas bonne.
    Je suis entièrement d'accord, surtout que ce n'est pas possible simplement.

    Citation Envoyé par Keihilin Voir le message
    Même si il me semble comprendre où tu veux en venir, j'ai quand même l'impression que tu cherches à faire entrer un pattern à tout prix là où ce n'est pas nécessaire...
    Disons que j'avais une bride de pattern que je souhaitai approfondir, comme d'habitude le mieux est de repartir de zéro.

    Bon voilà le résultat :
    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
    using System.Collections.Generic;
     
    class Manager<G>
    {
        public G widget;
        private static Manager<G> instance;
     
        protected Manager()
        {
        }
     
        public static Manager<G> get_instance()
        {
            if (instance == null)
            {
                instance = new Manager<G>();
            }
            return instance;
        }
     
        public virtual MyObject create_object()
        {
            return new MyObject();
        }
    }
     
    class MyObject
    {
    }
     
    class Project : MyObject
    {
    }
     
    class TreeView
    {
    }
     
    class ProjectManager : Manager<TreeView>
    {
        public override MyObject create_object()
        {
            return new Project();
        }
    }
     
    class Test
    {
        static void Main(string[] args)
        {
            Manager<TreeView> factory = ProjectManager.get_instance();
        }
    }
    Est ce que c'est plus compréhensible ?

  15. #15
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Citation Envoyé par Skyrunner Voir le message
    Je parle des 2 patterns existants : la fabrique et la fabrique abstraite.
    http://fr.wikipedia.org/wiki/Fabriqu..._conception%29
    http://fr.wikipedia.org/wiki/Fabriqu..._conception%29
    L'un utilise l'autre mais il faut quand même qu'il sache ce qu'il veut faire le ptit gege.
    Bon bah je m'excuse encore de mon erreur, mais en faite je ne connaissais que la fabrique abstraite et je l'avais considéré comme la fabrique


    oui un peu plus clair en même temps si tu ne mets pas les fonction en abstract l'utilisateur n'est pas obligé de les overrider.

    Pour les interfaces, cela fonctionne un peu comme les classe abstraites, cela oblige toutes classes l'utilisant d'ovverider un certain nombre de méthode.
    C'est comme un contrat de confiance qui permet d'être sur que toutes classes implémentant telle IHM possède certaines méthodes bien précise.

Discussions similaires

  1. design pattern factory
    Par olive_le_malin dans le forum C++
    Réponses: 2
    Dernier message: 23/08/2007, 15h31
  2. Classe + design pattern factory
    Par Rodrigue dans le forum C++
    Réponses: 8
    Dernier message: 07/11/2006, 14h42
  3. [Conception]Design Pattern Factory ?
    Par ®om dans le forum Logging
    Réponses: 8
    Dernier message: 13/09/2006, 10h20
  4. [Fabrique] [Java] Design Pattern Factory
    Par SkyBioSS dans le forum Design Patterns
    Réponses: 3
    Dernier message: 24/05/2006, 14h53

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