Идея паттерна Абстрактная фабрика (Abstract Factory)

Паттерн (шаблон) проектирования — это продуманный способ построения исходного кода программы для решения часто возникающих в повседневном программировании проблем проектирования. Иными словами, это уже придуманное решения, для типичной задачи. При этом паттерн не готовое решение, а просто алгоритм действий, который должен привести к желаемому результату. Давайте рассмотрим один из наиболее часто используемых порождающих паттернов — Абстрактная фабрика (Abstract Factory).

Как я уже писал ранее, существует три вида паттернов проектирования:

  • Порождающие паттерны позволяют возможность выполнять инициализацию объектов наиболее удобным и оптимальным способом.
  • Структурные паттерны описывают взаимоотношения между различными классами или объектами, позволяя им совместно реализовывать поставленную задачу.
  • Поведенческие паттерны позволяют грамотно организовать связь между сущностями для оптимизации и упрощения их взаимодействия.

Абстрактная фабрика (Abstract Factory) – это порождающий паттерн, предоставляющий возможность создания семейства взаимосвязанных или родственных объектов, не специфицируя их классов. То есть, мы определяем интерфейс для создания взаимосвязанных объектов, без необходимости реализации конкретных классов.

Архитектура паттерна Абстрактная фабрика (Abstract Factory)

Давайте рассмотрим UML диаграмму абстрактной фабрики.

Абстрактная фабрика (Abstract Factory)

Абстрактная фабрика (Abstract Factory)

  • AbstractFactory — объявляет интерфейс для создания семейства взаимосвязанных или родственных объектов
  • AbstractProductA, AbstractProductB — се­мейство продуктов, которые будут использоваться клиентом для выполнения своих задач
  • ProductA1, ProductB1 — конкретные типы продуктов
  • Client — клиент фабрики, который получает конкретные продукты для реализации своего поведения

Логика работы паттерна Абстрактная фабрика (Abstract Factory)

Паттерн абстрактная фабрика позволяет создавать группы взаимосвязанных объектов. То есть для начала мы должны определить группу свойств и методов, которые будут характерны для всех представителей группы. Например возможность передвигаться у живых существ. Потом мы можем выделить конкретные фабрики для производства разных групп существ, например фабрику по производству птиц, которые будут летать, фабрику для млекопитающих, которые будут бегать, и фабрику пресмыкающихся, которые будут ползать. Каждая из фабрик будет создавать экземпляры своего типа, но при этом все они будут иметь возможность передвигаться, но по своему.

Реализация паттерна проектирования Абстрактная фабрика (Abstract Factory) на языке C#

Итак, для начала выберем предметную область для которой будем разрабатывать абстрактную фабрику. Пусть это будет невероятно упрощенное подобие пошаговой стратегии «Космические рейнджеры». Мы будем использовать абстрактную фабрику для создания экземпляров космических кораблей. Итак, класс абстрактной фабрики будет выглядеть следующим образом:

SpaceshipFactoryBase.cs

Как видно из кода, у любого космического корабля, создаваемого с помощью абстрактной фабрики будут два свойства Уровень здоровья и Тип, а также будут динамически определиться его Двигатель, Оружие и Источник энергии.

Теперь нам необходимо рассмотреть реализацию абстрактных компонентов, из которых состоит космический корабль Двигатель, Оружие и Источник энергии.

EnergyBase.cs

Как видно из кода, у двигатель любой источник энергии космического корабля содержит в себе одно свойство Количество энергии и метод, позволяющий эту энергию расходовать. Но при этом это никакой-то определенный источник энергии, это только шаблон описывающий каким должен быть источник энергии.

Соответственно, теперь нам нужно для разнообразия определить несколько возможных источников энергии:

SunEnergy.cs

PlasmEnergy.cs

Мы создали два возможных источника энергии (солнечный и плазменный), которые уже конкретно реализуют логику расходования энергии.

Таким же образом нам необходимо реализовать и шаблоны для оружия и двигателей, и их конкретные реализации.

GunBase

LaserGun.cs

PhotonGun.cs

EngineBase.cs

PhotonEngine.cs

PulseEngine.cs

Таким образом мы получаем три класса шаблона для каждой составляющей двигателя и по две конкретных реализации.

Теперь нам необходимо создать конкретные фабрики по производству заданных типов космических кораблей. То есть это заранее заложенная конфигурация компонентов и других свойств, заданные в фабрике, которая будет создавать экземпляры классов в соответствии с шаблоном. Для начала опишем пиратский корабль.

PiratSpaceshipFactory.cs

Как видно из кода здесь мы переопределяем абстрактные компоненты космического корабля конкретными типами, а также устанавливаем некоторые свойства.

Теперь добавим другой тип космических кораблей. Пусть это будут военные корабли.

WarSpaceshipFactory.cs

Соответственно мы переопределяем те же компоненты абстрактной фабрики, но другой конфигурацией.

Таким образом у нас существует абстрактная фабрика, описывающая структуру космического корабля без конкретного описания из чего он состоит (у корабля должно быть оружие, но какое не конкретизируется). Далее у нас есть фабрики, которые конкретизируют некоторые компоненты космического корабля (у пиратских кораблей стоят фотонные пушки). И теперь осталось описать класс космического корабля, который будет выходить из любой фабрики.

Spaceship.cs

Соответственно, при создании корабля нам достаточно передать его имя и фабрику для его создания. Такая реализация дает возможность очень быстро адаптировать конфигурации кораблей, добавлять новые типы компонентов, создавать новые фабрики для различных видов космических кораблей.

Теперь нам необходимо проверить работу нашей фабрики. Давайте устроим соревнование между пиратским кораблем и военным судном. Соревноваться они будут в дальности полета и в нанесении урона. Для удобства использования создадим отдельный класс соревнования.

Battle.cs

Ну и теперь нам осталось только использовать наши классы и вывести результаты пользователю.

Program.cs

В итоге получаем следующий результат работы программы:

Abstract Factory result

Abstract Factory result

Полный исходный код программы можно найти в репозитории https://github.com/shwanoff/AbstractFactory

Рекомендую также изучить статью Паттерн Фабричный метод (Factory Method).

P.S. Присоединяйся в любой удобной для тебя социальной сети. Для меня очень важно оставаться с тобой на связи, ведь у меня есть еще много полезной информации о программировании для тебя, которой я хочу с тобой поделиться.

Вконтакте
Telegram
Facebook
Twitter
Одноклассники
Дзен
Google+

 
×
%d такие блоггеры, как: