Шаг 5 - Прототип. Prototype

Предположим, что Ваша стратегия может манипулировать воинами CWarrior, поведение которых практически одинаково (т.е. они могут охранять, патрулировать, сражаться и идти) - единственно чем они отличаются -видом вооружения. Значит, лучники и копейщики (CArcher, CPikeman) порождаются от базового класса CWarrior.

Производить их вручную неразумно. Поможет ли абстрактная фабрика? Конечно. Если видов вооружения не слишком много. А если много - то придется прописывать по конкретной фабрике на каждого воина, включая хлебореза (не последний человек в армейской иерархии!). Если Вы считаете, что хлеборезу будет жирно иметь свою фабрику, можно найти и другой вариант: пусть хлеборез размножается самостоятельно. Нужно только абстрагироваться от этого процесса - функция размножения возлагается на CWarrior.

// Абстрактный класс
class CWarrior
{
	// Чистая виртуальная производящая функция
	// создающая клон, не обязательно полную копию.
	virtual CWarrior* clone() const =0;
};
// конкретный класс
class CArcher : public CWarrior
{
	// производящая функция переопределена.
	CWarrior* clone () const { return new CArcher;};
};

Теперь клиент для получения экземпляра должен обратиться к предварительно заданному экземпляру, который специально для этого создан (вероятно) - он, собственно и есть прототип. Прототипом можно конфигурировать абстрактную фабрику. Он вообще является вырожденным случаем фабрики - он производит только один класс -который и есть он сам. Главная сложность - поддержка clone() со стороны всех классов.

Это структура паттерна.

5_1.gif (6154 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Albert Makhmutov - 07.07.2001