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.
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