2017-02-02 21 views
1

Здравствуйте, мой вопрос касается того, можно ли использовать шаблон фабрики для классов с таким же количеством аргументов в своем конструкторе, но с разными типами. Например, у меня есть интерфейс под названием IVerify. У меня есть 2 классов, которые реализуют их, NameVerifier, который принимает во имя Струнный в своем конструкторе и IntegerVerifier, который принимает в INT NUM в конструктор. Можно ли в этом случае сделать заводскую модель?Использование шаблона Factory Method для разных аргументов

Могли бы мы использовать IVerify Factory.CreateNameVerifier (строка) и IVerify Factory.createIntegerVerifier (интермедиат) ли он по-прежнему рассматривается как шаблон фабрики?

Дополнительное примечание: Im используя C++

+0

Мне кажется, что вы вводите значения времени выполнения (возможно, значения, которые вы хотите проверить) в конструкторы ваших компонентов (валидаторы). Это плохая идея, как [объяснено здесь] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99). – Steven

ответ

1

Если есть много версий NameVerifier и IntegerVerifier тогда ваше решение еще Factory Pattern, так как вы будете абстрагирование, какой класс инстанцировать внутри CreateNameVerifier и CreateIntegerVerifier.

Но если Verifiers уникален WRT с типом аргумента, что они принимают то, есть только один NameVerifier и только один IntergerVerifier и они отличаются из-за их типов, то ваше существующее решение только созданием своего рода обертку для создания объектов/Verifiers. В таком случае это должно быть что-то вроде этого:

Ссылка: 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 
} 

Примечание: Строгая проверка типов аргументов _Parameter не сделано перед созданием Verifiers. Вы можете расширить количество аргументов для создания объектов, используя Variadic Template/Parameter pack.