Паттерн Фабричный метод

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

Паттерн Фабричный метод

Реализация: Мы с вами на протяжении трех статей о шаблонах проектирования неплохо справляемся с разработкой различных программ для автопроизводителей, не будем нарушать традицию. На этот раз давайте попробуем создать линии сборки машин различной комплектации с использованием паттерна «Фабричный метод». Начнем с двух абстрактных классов один для класса машин:

Переменная name используется для хранения информации о типе машины – Luxury Car или Basic Car. Для хранения списка дополнительных опций комплектации используется переменная списочного типа accessories. Для удобства вывода информации о созданной машине был переопределен метод toString(), который возвращает модель машины (переменная name) и список опций комплектации (перемення accessories).

Второй абстрактный класс для сборочных линий:

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

В каждом из подклассов реализован метод createCar(), который создает объект нужной машины и возвращает его. Условие шаблона «Фабричный метод» мы выполнили – делегировали создание объектов подклассам. Давайте теперь создадим сами классы машин, все они будут наследоваться от абстрактного класса Car() описанного выше:

В конструкторе каждого из классов мы задаем имя нашей машины и добавляем опции комплектации в переменные name и accessories соответственно, обе переменные были объявлены в абстрактном классе Car.

Задача паттерна «Фабричный метод» — перемещение создания экземпляров в подклассы

Пришло время протестировать нашу программу и посмотреть, как это все вместе работает:

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

Первыми двумя строчками CarFactory myLuxFactory = new LuxCarFactory(); и CarFactory myBasicFactory = new BasicCarFactory(); мы создали две фабрики по производству машин или созданию объектов. Следующими двумя строчками Car myLuxCar = myLuxFactory.createCar(); и Car myBasicCar = myBasicFactory.createCar(); мы создали по машине (объекту) на соответствующих фабриках. Ну и последними двумя вывели информацию о созданных нами машинах (объектах).

У данного шаблона есть как достоинства, так и недостатки. К достоинствам можно отнести: возможность сделать более универсальный код создания объектов, не привязываясь к конкретным классам (в нашем случае LuxCar и BasicCar), и еще одно не мало важное достоинство – это возможность установить связь между параллельными иерархиями классов. Главным же недостатком этого паттерна является необходимость создавать наследника для каждого нового типа продукта.

В качестве небольшой практики попробуйте изменить метод createCar() так, чтобы он принимал в качестве параметра количество машин, которое мы хотим создать и соответственно создавал нужную нам партию машин.



Паттерн Фабричный метод полный код примера:

Site Footer