В настоящее время я пытаюсь внедрить шаблон проектирования фабрики и несколько смущен относительно того, как это обычно делается на C++. Я имею в виду веб-страницу this.Когда использовать статические функции класса вместо функций с именами?
На этой веб-странице они показывают пример, где они определяют фабричный класс под названием ComputerFactory. Этот класс имеет единственный метод NewComputer, который является статическим.
class ComputerFactory
{
public:
static Computer *NewComputer(const std::string &description)
{
if(description == "laptop")
return new Laptop;
if(description == "desktop")
return new Desktop;
return NULL;
}
};
Тот факт, что NewComputer статичен, означает, что он не связан с одним экземпляром ComputerFactory. Таким образом, можно вызвать этот метод из вашего кода, написав
ComputerFactor::NewComputer("description");
Сейчас мне очень интересно, почему это необходимо, чтобы быть обернуты в классе. Потому что это статический и на самом деле не означает быть связан с любым классом, было бы больше смысла, чтобы сделать что-то вроде
namespace ComputerFactory
{
static Computer *NewComputer(const std::string &description)
{
if(description == "laptop")
return new Laptop;
if(description == "desktop")
return new Desktop;
return NULL;
}
}
Так мои вопросы:
- является функция пространства имен я описал действительный альтернатива?
- Было бы целесообразно определить класс, который имеет только статические методы? Похоже, имеет смысл использовать пространство имен.
Теперь я считаю, что существуют случаи, когда имеет смысл иметь статические методы (например, static ', сколько из этих классов в настоящее время существует), но это не похоже на ситуацию, когда это необходимо. Есть предположения?
Редактировать: Так что я просто подумал, пример, который я привел, не является «типичным» заводским методом. На практике возможно, что заводская функция более сложна и требует вызова других функций (методы частного класса). В этом случае вполне логично было бы превратить фабрику в класс, чтобы вы могли получить доступ к подфункциям. Разве это почему фабричные методы обычно завернуты в классы?