Заводской объект против заводской функции - PullRequest
6 голосов
/ 11 февраля 2009

У меня есть азбука с несколькими производными классами. Для создания этих производных классов я использую шаблон фабрики:

.h файл:

class derivedFactory
{
public:
    base* createInstance();
};

.cpp файл:

base* derivedFactory::createInstance()
{
    return new derived();
}

Есть ли какое-то преимущество перед простой функцией:

.h файл:

base* derivedFactoryFunction();

.cpp файл:

base* derivedFactoryFunction()
{
    return new derived();
}

Также: я использую абстрактный шаблон фабрики для внедрения зависимостей. Я мог бы использовать иерархию наследования, основанную на ABC:

class objectCreator
{
public:
    base* create() = 0;
};

Есть ли преимущество в использовании этого по сравнению с указателем на функцию:

boost::function<base* ()> factory_ptr;

Используя boost :: bind / lambda, это, кажется, делает мой код более компонуемым, и, если я хочу, я могу обернуть в него настоящий фабричный объект. Я вижу, что может быть небольшое снижение производительности, но об этом стоит беспокоиться, так как он вызывается только во время запуска.

Ответы [ 4 ]

2 голосов
/ 11 февраля 2009

Это зависит от того, насколько гибкой должна быть ваша фабрика. Если фабрике требуется внешняя информация (например, из файла конфигурации, параметров программы и т. Д.), Чтобы определить, как создавать объекты, тогда объект имеет смысл. Если все, что вам когда-либо понадобится, в аргументах фабрики, то функция, вероятно, подойдет.

Единственное преимущество, которое я вижу в наличии указателя, - это тестирование, где вы можете использовать другую фабричную функцию.

1 голос
/ 11 февраля 2009

Я бы сказал, что преимущество наличия фабричной функции в качестве статического метода внутри самого класса состоит в том, что ясно, что она является частью жизненного цикла этого класса. Делать его отдельно означает, что другим программистам, которые используют ваш класс, придется искать в другом месте метод фабрики.

Извините, я не совсем уверен, что именно вы имеете в виду, передавая указатель функции на фактор-метод, но я обычно не буду использовать указатель на функцию, если вам это не нужно. Указатели на функции не могут быть встроены, поскольку они не могут быть разрешены во время компиляции, что означает, что они могут быть медленнее. Но кроме того, использование указателя на функцию выглядит просто нехорошо, если вы уже можете быть уверены в том, какую функцию вы будете вызывать во время компиляции.

1 голос
/ 11 февраля 2009

Хотите ли вы когда-нибудь более одного завода для одного типа? Если это так, вам нужны фабричные объекты.

1 голос
/ 11 февраля 2009

Наличие интерфейса с одним методом или указателем на метод эквивалентно.

Но во втором случае у вас возникнут проблемы, если вы захотите, чтобы другой метод соответствовал первому ...

И интерфейс, на мой взгляд, более читабелен, чем указатель метода.

Тогда вы выбрали.

...