Паттерн Абстрактная фабрика

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

Паттерн Абстрактная фабрика

Применяется в случаях: когда программа должна быть независимой от процесса и типов создаваемых новых объектов; когда необходимо создать семейства или группы взаимосвязанных объектов исключая возможность одновременного использования объектов из разных этих наборов в одном контексте

Реализация: Для напишем код для комплектующих, коих у нас будет три – GPS, руль и салон. Для каждого из комплектующих создадим интерфейс:

Каждый интерфейс реализован двумя классами за исключением интерфейса GPS:

Как вы могли заметить деление классов идет на продукцию для люксовых машин и на продукцию для машин базовой комплектации, за исключением GPS который мы в базовую комплектацию не будем устанавливать ни в каком виде. В каждом из классов реализован метод toString(), который будет возвращать строковое значение установленного компонента.

С продукцией разобрались, теперь начнем работу над фабриками, которые будут производить нужные нам компоненты (создавать объекты классов компонентов). Начнем с общего интерфейса:

В интерфейсе три абстрактных метода, каждый из которых производит соответствующий компонент. Реализации фабрик будут тоже делиться на два типа – фабрики по производству компонентов для люксовых машин и для базовых машин:

Каждый из реализованных методов возвращает созданный компонент нужной детали. Обратите внимание в базовой комплектации у машин нет GPS, поэтому метод addGPS() возвращает null.

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

В классе присутствуют две переменных: одна для хранения названия машины (name), вторая для хранения информации о комплектующих установленных в машину (accessories). В классе так же переопределен метод toString(), который теперь сообщает название машины и из каких комплектующих она состоит.

Машин, как Вы уже догадались у нас будет две – одна люксовая, другая базовая. Создадим для них классы:

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

Настало время проверить как все работает:

Вывод:
Model car: Luxury Car
[Leather Salon, Heated steering wheel, GPS]
Model car: Basic Car
[Basic Salon, Basic steering wheel]

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



Паттерн Абстрактная фабрика полный код примера:

Site Footer