Как и в случае с одноэлементным шаблоном в Factory Pattern, мы не будем напрямую создавать экземпляр класса с использованием ключевого слова new. В синглтоне мы будем создавать единственный экземпляр определенного класса, но на заводе мы создадим экземпляр одного или нескольких подклассов, созданных из абстрактного или interface класс. И эти несколько подклассов могут быть созданы в одном классе Factory, где экземпляр будет создан и возвращен для использования.

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

Выполнение

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

Каждая сделка будет включать разные услуги. Салон предлагает 4 услуги: стрижка, окраска волос, уход за лицом и стрижка. Для них я создал абстрактный класс под названием Service, как показано ниже.

Создан простой абстрактный класс Service. 4 услуги, которые предоставляет салон красоты, расширяются из этого класса. Создание подчиненных / дочерних классов можно увидеть ниже.

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

Как видите, абстрактный класс будет содержать ArrayList для хранения объектов Service. Метод CreateDeals() будет переопределен дочерними классами. Метод печати сделки распечатает сделку, которую выбрал пользователь. Следующие подклассы создаются с помощью этого абстрактного метода.

Каждая сделка будет добавлять услуги, которые они предоставляют, к объекту ArrayList, который находится в родительском классе. И printDeal() метод переопределяется в дочернем классе.

Примечание: вам может быть интересно, почему super.printDeal () не является первой строкой метода. Метод super должен быть первой строкой только при вызове конструктора родительского класса. Например, методы, которые они могут вызывать в любой строке, которую пожелает программист.

Примечание: вы, ребята, также можете подумать, почему createDeals () находится внутри конструктора. Дело в том, что внутри конструктора родительского класса вызывается метод createDeal (). Причина этого в том, что всякий раз, когда мы создаем экземпляр дочернего класса, будет вызываться конструктор родительского класса, и метод для добавления служб будет вызываться автоматически.

При желании вы можете создать любое количество услуг и сделок, которое пожелаете, но пока давайте остановимся на этих 4 услугах и 3 сделках. Мы создали сделки, теперь последняя часть - это создание класса Factory, который будет обрабатывать создание необходимых экземпляров.

Вышеупомянутая реализация фабричного класса. Как видите, метод createDeal () является статическим, поэтому его можно вызывать без создания экземпляра класса ParlorFactory. Следующее, на что следует обратить внимание, это то, что метод будет иметь параметр, этот параметр будет определять, какой подкласс сделки должен быть возвращен как объект.

Примечание. Некоторые могут подумать, почему в этих случаях переключения нет оператора break. Причина в том, что программа автоматически выйдет из метода после оператора return. Это простая ошибка, которую я сделал, когда получил ошибку компиляции 😅.

Теперь у нас есть все необходимое, кроме основного метода. Ниже приводится основной метод.

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

Ключевые моменты

Теперь, когда мы знаем о шаблоне проектирования Factory method, давайте обсудим некоторые его ключевые моменты.

  • В отличие от шаблона singleton в шаблоне factory, как видно из приведенной выше реализации, мы передадим параметр, и класс Factory решит, какой подкласс создать и вернуть.
  • Шаблон Factory Design подобен перегрузочному полиморфизму, который выполняется виртуально.
  • В заводском шаблоне родительские классы не взаимодействуют напрямую с пользователями. Только дочерние классы есть.
  • Как видно из приведенной выше реализации, мы не видим логику запуска явно в классе фабричного метода. Основной класс видит только фабричный класс и ничего больше.
  • Конструкции заводских методов используются на более высоких уровнях JDK. Например, класс NumberFormat и классы DateTime имеют getInstance() методы, в которых передаваемый параметр будет определять объект, который мы получаем.

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

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

Примечание: это не относится к основной теме. Если вы, ребята, запускаете java-коды без IDE и в вашем cmd. Столкнувшись с вышеупомянутой ситуацией, когда необходимо скомпилировать несколько файлов одновременно. Простое использование javac packagename/*.javathis.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

Щелкните здесь для перехода по ссылке GitHub на реализованные выше сегменты кода.

Видео, сделанное Кришантой Динеш, очень помогло при создании этой статьи.