В этой статье я собираюсь обсудить шаблон Factory Method. Это один из шаблонов проектирования, известный также как виртуальный конструктор. Обычно в Java мы используем ключевое слово new для создания объекта класса. Это прекрасно подходит для небольших программ. Но подумайте о крупномасштабном приложении корпоративного уровня, тогда будет сложно управлять кодом. В шаблоне Singleton мы не создаем экземпляры с использованием ключевого слова new, и здесь тоже. Проще говоря, мы можем понять это по самому названию, используя классы, которые действуют как фабрики для создания из них объектов. Итак, в этом шаблоне мы определяем интерфейс (это будет суперкласс), который может быть интерфейсом Java или абстрактным классом для создания объектов, но позволяет конкретным подклассам изменять тип создаваемых объектов. Наиболее важно то, что подклассы реализуют фабричный метод для выбора класса, для которого должны быть созданы объекты. Основное преимущество использования этого шаблона заключается в том, что мы можем создавать слабосвязанные системы и создавать объекты, не открывая клиенту логику создания.

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

Давайте посмотрим на пример использования для дальнейшего понимания,

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

Посмотрим на код,

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

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

Это конкретные классы, которые расширяют абстрактный класс Ticket, и каждый конкретный класс имеет метод setTicketFare() для установки значения ticketFare. Таким образом, на основе значения enum метод setTicketFare() будет переопределен. Теперь давайте создадим фабричный класс,

Этот класс отвечает за решение, из какого класса следует создать экземпляр объекта. Таким образом, на основе параметра этот метод создаст и вернет экземпляр из конкретного класса. Теперь реализуем основной метод,

Как видно из приведенного выше кода, я печатаю начальные данные, после чего пользователь должен ввести номер по своему усмотрению. Затем я получаю количество мест в качестве ввода. Таким образом, в операторе switch объект будет создан на основе type, выбранного пользователем. Затем я вызываю метод setTicketFare(). После расчета сумма сохраняется в переменной amount и, наконец, печатается как результат.

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

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

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

  • создание подклассов не завершается в классе
  • реализация продукта со временем будет развиваться, но клиент останется прежним.

использованная литература

Я сослался на следующее видео YouTube, чтобы написать эту статью, которую сделала Кришанта Динеш