указывая их конкретные типы. Если код их создания рассредоточен по всему приложению, то
добавлять новые типы персонажей или заменять существующие будет затруднительно.
В таких случаях на помощь приходит фабрика объектов, локализующая создание экземпляров
классов. С её помощью можно создавать объекты нужных классов, не указывая напрямую их
типы. В
самом простом случае, для этого используются идентификаторы типов. Следующий
пример демонстрирует простейший вариант фабрики объектов - фабричную функцию.
public enum WarriorTypes
{
Infantryman,r
Archer,
Horseman
}
…
///
/// Создание воина
///
///
Тип воина
///
public static Warrior CreateWarrior(WarriorTypes parWattiorType)
{
Warrior warrior = null;
switch (parWattiorType)
{
case WarriorTypes.Infantryman:
warrior = new Infantryman();
break;
case WarriorTypes.Archer:
warrior = new Archer();
break;
case WarriorTypes.Horseman:
warrior = new Horseman();
break;
}
return warrior;
}
Теперь, скрывая детали, код создания объектов разных типов игровых персонажей сосредоточен
в одном месте, а именно, в
фабричной функции CreateWarrior( ). Эта функция получает в качестве
аргумента тип объекта, который нужно создать, создает его и возвращает соответствующий
указатель на базовый класс.
Несмотря на очевидные преимущества, у этого варианта фабрики также существуют недостатки.
Например, для добавления нового вида боевой единицы необходимо сделать несколько шагов -
завести новый идентификатор типа и модифицировать код фабричной функции CreateWarrior( ).
Показав основные проблемы, которые возникают при добавлении новых типов классов,
рассмотрим порождающие шаблоны и особенности каждого из них:
•
Шаблон «Фабричный метод» (Factory Method). В
данном шаблоне вводится
полиморфный класс Factory, в котором определяется интерфейс фабричного метода,
подобного CreateWarrior( ), а ответственность за создание объектов конкретных классов
переносится на производные от Factory классы, в
которых этот метод переопределяется;
•
Шаблон «Абстрактная фабрика» (Abstract Factory). Использует несколько фабричных
методов и предназначен для создания целого семейства или группы взаимосвязанных
объектов. Для приведённого выше примера, шаблон может предоставлять
методы для
создания всех типов воинов;
•
Шаблон «Строитель» (Builder). Определяет процесс поэтапного конструирования
сложного объекта, в результате которого могут получаться разные представления этого
объекта;
•
Шаблон «Прототип» (Prototype). Создаёт новые объекты с помощью прототипов (создавая
копии самого себя);
•
Шаблон «Синглетон» (Singleton). Позволяет создавать только один экземпляр класса.
Достарыңызбен бөлісу: