Skip to content

Abstract Factory

Pandas edited this page Jun 16, 2017 · 9 revisions

Абстрактная фабрика - паттерн, порождающий объекты.


Назначение

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Применимость

Используйте паттерн абстрактная фабрика, когда:

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

Структура

Imgur

Участники

  • AbstractFactory - абстрактная фабрика: объявляет интерфейс для операций, создающих абстрактные объекты-продукты;
  • ConcreteFactory - конкретная фабрика: реализует операции, создающие конкретные объекты- продукты;
  • AbstractProduct - абстрактный продукт: объявляет интерфейс для типа объекта-продукта;
  • ConcreteProduct - конкретный продукт: определяет объект - продукт, создаваемый соответствующей конкретной фабрикой, реализует интерфейс Abstract Product;
  • Client - клиент: пользуется исключительно интерфейсами, которые объявлены в классах AbstractFactory и AbstractProduct.

Отношения

  • Обычно во время выполнения создается единственный экземпляр класса ConcreteFactory. Эта конкретная фабрика создает объекты продукты, имеющие вполне определенную реализацию. Для создания других видов объектов клиент должен воспользоваться другой конкретной фабрикой;
  • AbstractFactory передоверяет создание объектов продуктов своему подклассу ConcreteFactory.

Реализация

  • фабрики как объекты, существующие в единственном экземпляре
  • создание продуктов. Класс Abstract Factory объявляет только интерфейс для создания продуктов. Фактическое их создание – дело подклассов ConcreteProduct.
  • определение расширяемых фабрик. Класс AbstractFactory обычно определяет разные операции для каждого вида изготавливаемых продуктов. Виды продуктов кодируются в сигнатуре операции. Для добавления нового вида продуктов нужно изменить интерфейс класса AbstractFactory и всех зависящих от него классов.

Результаты

Паттерн абстрактная фабрика обладает следующими плюсами и минусами:

  • Изолирует конкретные классы.
  • Упрощает замену семейств продуктов.
  • Гарантирует сочетаемость продуктов.
  • Поддержать новый вид продуктов трудно.

Clone this wiki locally