Есть хороший трюк, который позволяет написать фабричный метод без последовательности if...else if...
.
(обратите внимание, что, AFAIK, в C ++ действительно невозможно делать то, что вы хотите, так как этот код генерируется во время компиляции. Для этого существует "фабричный метод" Шаблон проектирования ) 1008 *
Сначала вы определяете global repository
для ваших производных классов. Он может иметь вид std::map<std::string, Base*>
, то есть отображает имя производного класса в an instance
этого класса.
Для каждого производного класса вы определяете default constructor
, который добавляет объект этого класса в хранилище под именем класса. Вы также определяете статический экземпляр класса:
// file: der1.h
#include "repository.h"
class Der1: public Base {
public:
Der1() { repository[std::string("Der1")] = this; }
};
// file: der1.cpp
static Der1 der1Initializer;
Конструкторы статических переменных запускаются даже до main()
, поэтому при запуске main
у вас уже есть инициализированный репозиторий с экземплярами всех производных классов.
Ваш фабричный метод (например, Base::getObject(const std::string&)
) должен найти в карте хранилища имя класса. Затем он использует метод clone()
объекта, который он находит, чтобы получить новый объект того же типа. Вам, конечно, нужно реализовать clone
для каждого подкласса.
Преимущество этого подхода в том, что при добавлении нового производного класса ваши добавления ограничиваются только файлами, реализующими новый класс. Хранилище и заводской код не изменятся. Конечно, вам все равно придется перекомпилировать программу.