Предположим, Вы пишете игру. Стратегию. У Вас есть классы "Ферма", "Фермер", "Рыцарь". Где-то в коде для производства экземпляров Вы пишете:
CFarm* theFarm = new CFarm; CFarmer* theFarmer = new CFarmer; CKnight* theKnight = new CKnight;
или наподобие того. Они взаимодействуют между собой, могут друг друга производить или уничтожать, изменять состояния. Но стратегия предполагает противника. Пусть будут гномы, и они представлены классами "Шахта", "Шахтер", "Топорник": CMine, CMiner, CAxer. Алгоритм (движок, engine) принципиально один и тот же, и будет скучно переписывать куски кода только из-за того, что конструкторы НЕВИРТУАЛЬНЫЕ. Следовательно, нужно как-то виртуализовать производство юнитов, а способ для этого один: выделить производство в специальный класс (фабрику объектов), и в нем объявить виртуальный метод производства.
Подробнее:
CProductive* CreateProductive(); CWorker* CreateWorker(); CWarrior* CreateWarrior();
Это структура паттерна. Клиент использует продукты, и обращается за их производством к абстрактной фабрике.