Предположим, что Ваша стратегия может манипулировать воинами CWarrior, поведение которых практически одинаково (т.е. они могут охранять, патрулировать, сражаться и идти) - единственно чем они отличаются -видом вооружения. Значит, лучники и копейщики (CArcher, CPikeman) порождаются от базового класса CWarrior.
Производить их вручную неразумно. Поможет ли абстрактная фабрика? Конечно. Если видов вооружения не слишком много. А если много - то придется прописывать по конкретной фабрике на каждого воина, включая хлебореза (не последний человек в армейской иерархии!). Если Вы считаете, что хлеборезу будет жирно иметь свою фабрику, можно найти и другой вариант: пусть хлеборез размножается самостоятельно. Нужно только абстрагироваться от этого процесса - функция размножения возлагается на CWarrior.
// Абстрактный класс class CWarrior { // Чистая виртуальная производящая функция // создающая клон, не обязательно полную копию. virtual CWarrior* clone() const =0; }; // конкретный класс class CArcher : public CWarrior { // производящая функция переопределена. CWarrior* clone () const { return new CArcher;}; };
Теперь клиент для получения экземпляра должен обратиться к предварительно заданному экземпляру, который специально для этого создан (вероятно) - он, собственно и есть прототип. Прототипом можно конфигурировать абстрактную фабрику. Он вообще является вырожденным случаем фабрики - он производит только один класс -который и есть он сам. Главная сложность - поддержка clone() со стороны всех классов.
Это структура паттерна.