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