Функция фабрики как статический член в классе или в пространстве имен?

0

Должна ли фабричная функция быть в ней собственным классом как статический член или в пространстве имен? Есть ли разница между двумя значениями, которые я должен использовать при создании фабрики классов?

В моем случае классы, созданные на заводе, представляют собой контейнерные объекты с различными структурами памяти, поддерживающими их. Что-то вроде

template< typename T >
class Parent
{
    virtual void myFunction() = 0;
    // more virtual interface functions...
}

template< typename T >
class ChildA : public Parent< T >
{
    virtual void myFunction() override;
}

template< typename T >
class ChildB : public Parent< T >
{
    virtual void myFunction() override;
}


template< typename T >
Parent< T >* factory( PerformanceTraits traits );

Я взглянул на функции Namespace + против статических методов в классе и также прочитал, что Скотт Майерс должен сказать по этому вопросу, но я, похоже, не могу применить это к заводским функциям.

Если я использую пространство имен, я могу написать

Parent* obj = MyFactoryNamespace::factory< int >( traits );

в сравнении с

Parent* obj = MyFactoryClass< int >::factory( traits );

если я использую шаблонный заводский класс. Помимо этого есть два способа написать одно и то же: существуют ли технические отличия?

Благодарю.

  • 0
    Я думаю, что вопрос, который вы связали, уже отвечает на это довольно хорошо. Единственное, что нужно иметь в виду, это тестирование: намного сложнее открыть класс, чем пространство имен.
Теги:
design

2 ответа

0
Лучший ответ

Это зависит. Нет никакого реального ответа. Во многих случаях единственный класс, видимый пользователю, является абстрактным базовым классом; фактический класс, создаваемый фабрикой, объявляется и определяется в неназванном пространстве имен в исходном файле. В таких случаях, очевидно, заводские функции будут находиться в пространстве имен, объявленном в заголовке. Если этот шаблон используется в вашем приложении, тогда имеет смысл быть последовательным и объявлять все ваши фабричные функции в области пространства имен. В противном случае это скорее вопрос стиля. Почувствуйте себя лучше. (Но будьте последовательны.)

0

В любом случае вы просто получаете глобальное название с глупым именем. Но большинство читателей кода ожидали, что он станет статическим членом создаваемой вещи, а именно родителем. Это было бы привычным для меня способом, но использование какого-то другого пространства имен кажется несущественным и странным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню