Иметь интерфейс
class abc {
public:
virtual int foo() = 0;
...
}
class concrete1: public abc {
public:
int foo() {
..
}
class concrete2 : public abc {
public:
int foo() {
..
}
}
Теперь в моей основной программе мне нужно построить классы на основе значения переменной
abc *a;
if (var == 1)
a = new concrete1();
else
a = new concrete2();
Очевидно, мне не нужны эти две строки повсюду в программе (обратите внимание, что я здесь упростил, чтобы все было ясно). Какой шаблон дизайна я должен использовать, если он есть?
Фабрика, как предлагает литб, является основной идеей, однако для менее тривиального случая вам может потребоваться изучить такие вопросы, как различные аргументы для конструкторов.
Также обычно у вас будет какой-нибудь оператор switch для поиска того, какой класс использовать, это хрупко само по себе, потому что добавление нового конкретного класса требует, чтобы вы изменили класс factory, и вы можете сломать несвязанный код.





Во-первых, вы должны использовать фабричный или фабричный метод, как упоминалось в litb.
Но в дополнение к этому я советую вам использовать перечисление или, по крайней мере, символические константы, чтобы определить, какой класс создавать. Это намного легче читать, и это позволяет вам создавать гарантии для неожиданных значений.
Не забывайте свой чистый виртуальный деструктор в базовом классе. Также ';' должен идти после закрывающего символа "}" определения класса.