2017-02-02 1 views
1

Bonjour ma question est de savoir s'il est possible d'utiliser le modèle d'usine pour les classes ayant le même nombre d'arguments dans leur constructeur mais de types différents. Par exemple, j'ai une interface appelée IVerify. J'ai 2 classes qui les mettent en œuvre, NameVerifier, qui prend en String name dans son constructeur, et IntegerVerifier, qui prend dans un int num dans son constructeur. Est-il possible de faire le modèle d'usine dans ce cas?Utiliser le modèle Factory Method pour différents arguments

pourrait-on utiliser IVerify Factory.CreateNameVerifier (string) et IVerify Factory.createIntegerVerifier (int) est-il toujours considéré comme un modèle d'usine?

Note complémentaire: Im en utilisant C++

+0

Il me semble que vous injectez des valeurs d'exécution (probablement les valeurs que vous souhaitez valider) dans les constructeurs de vos composants (les validateurs). C'est une mauvaise idée, comme [expliqué ici] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99). – Steven

Répondre

1

S'il existe plusieurs versions de NameVerifier et IntegerVerifier alors votre solution est encore un motif d'usine puisque vous serez Abstracting classe à l'intérieur instancier CreateNameVerifier et CreateIntegerVerifier.

Mais si Verifiers sont wrt unique au type d'argument qu'ils prennent-à-dire, il n'y a qu'un seul NameVerifier et un seul IntergerVerifier et ils diffèrent en raison de leurs types, alors votre solution existante crée simplement une sorte d'emballage pour créer des objets/Verifiers. Dans ce cas, il devrait être quelque chose comme ceci:

Référence: Factory Pattern

class IVerify 
{ 
}; 

class CNameVerifier : public IVerify 
{ 
}; 

class CIntegerVerifier : public IVerify 
{ 
}; 

class CVerifierFactory 
{ 
    enum TYPE 
    { 
     STRING, 
     INTEGER 
    }; 

    template<typename T> 
    IVerify* CreateVerifier(const CVerifierFactory::TYPE &_enumType, T _Parameter) 
    { 
     IVerify *pVerifier = NULL; 
     switch(_enumType)  
     { 
      case (CVerifierFactory::STRING) 
       pVerifier = new CNameVerifier(_Parameter); 
       break; 
      case (CVerifierFactory::INTEGER) 
       pVerifier = new CIntegerVerifier(_Parameter); 
       break;    
     } 

     return pVerifier; 
    } 
}; 

CVerifierFactory g_oFactory; 
IVerify *pVerifier = g_oFactory.CreateVerifier(CVerifierFactory::STRING, "Alex"); 
if(pVerifier != NULL) 
{ 
    //use pVerifier 
} 

Note: Type de vérification stricte des arguments _Parameter ne sont pas fait avant de créer Verifiers. Vous pouvez augmenter le nombre d'arguments pour la création d'objet en utilisant Variadic Template/Parameter pack.