Должна ли фабричная функция быть в ней собственным классом как статический член или в пространстве имен? Есть ли разница между двумя значениями, которые я должен использовать при создании фабрики классов?
В моем случае классы, созданные на заводе, представляют собой контейнерные объекты с различными структурами памяти, поддерживающими их. Что-то вроде
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 );
если я использую шаблонный заводский класс. Помимо этого есть два способа написать одно и то же: существуют ли технические отличия?
Благодарю.
Это зависит. Нет никакого реального ответа. Во многих случаях единственный класс, видимый пользователю, является абстрактным базовым классом; фактический класс, создаваемый фабрикой, объявляется и определяется в неназванном пространстве имен в исходном файле. В таких случаях, очевидно, заводские функции будут находиться в пространстве имен, объявленном в заголовке. Если этот шаблон используется в вашем приложении, тогда имеет смысл быть последовательным и объявлять все ваши фабричные функции в области пространства имен. В противном случае это скорее вопрос стиля. Почувствуйте себя лучше. (Но будьте последовательны.)
В любом случае вы просто получаете глобальное название с глупым именем. Но большинство читателей кода ожидали, что он станет статическим членом создаваемой вещи, а именно родителем. Это было бы привычным для меня способом, но использование какого-то другого пространства имен кажется несущественным и странным.