22 июл. 2015 г.

Интерфейсы. Часть 9 – фабричные методы.

Как я уже говорил тут, правильней рассматривать и понимать интерфейсы в соответствии с их названием (interface), то есть "протокол" или "договор" взаимодействия. Еще интерфейс можно представлять как "шлюз" ведущий к разным реализациям.
Типичным механизмом создания объектов, реализуемых посредством интерфейсов, является паттерн (шаблон) проектирования "Фабричный метод".
Суть паттерна практически полностью описывается его названием. Когда вам требуется получать какие-то объекты, например пакеты сока, вам совершенно не нужно знать как их делают на фабрике. Вы просто говорите «сделайте мне пакет апельсинового сока», а «фабрика» возвращает вам требуемый пакет. Как? Всё это решает сама фабрика, например «копирует» уже существующий эталон. Основное предназначение «фабрики» в том, чтобы можно было при необходимости изменять процесс «появления» пакета сока, а самому потребителю ничего об этом не нужно было сообщать, чтобы он запрашивал его как и прежде.
Как правило, одна фабрика занимается «производством» только одного рода «продуктов». Не рекомендуется «фабрику соков» создавать с учетом производства автомобильных покрышек. Как и в жизни, паттерн «фабрика» часто создается «одиночкой».
Фабричные методы избавляют проектировщиков от необходимости встраивать в код зависящие от приложения классы.
Ну и чтобы все стало более-менее понятно попрактикуемся…
В первом примере мы будем выпускать сервисы как продукт. И у нас будет фабрика которая выпускает эти продукты. Сервис и фабрика будут описаны как интерфейсы. И так же мы создадим по паре реализаций для сервиса и фабрики сервисов. Пример взят из книги "Философия Java". Правда я его немного изменил, чтобы он стал чуть более понятным на мой взгляд.




Вывод у программы следующий:
I0029
Все эти строки выводятся статическим методом serviceConsumer(), в который я так же добавил код приведения типов, причем очень интересного приведения, когда интерфейсная ссылка приводится к ссылке на объект класса реализующего этот интерфейс. Это делается в блоках if метода serviceConsumer().
Так же я добавил имя сервиса в код имплементации сервиса, а метод получения этого имени описан в классе, а не в интерфейсе.
И еще один примерчик из той же книги…

В нем создаются имплементации игр шашки и шахматы. Ну как бы шашки и шахматы :) Это же пример…

7 комментариев:

  1. Ответы
    1. Вот он

      https://bitbucket.org/n0tb0dy/studyingjava/src/master/00019_Interfaces/src/pro/java/factory1/Factories.java

      Удалить
  2. Здравствуйте.будет продолжение по java?спасибо

    ОтветитьУдалить
    Ответы
    1. К сожалению пока совсем нет времени на блог. Но продолжить конечно есть в планах.

      Удалить
    2. Да, было бы здорово если бы была инфа о дженериках, коллекшн и основные моменты Java 8

      Удалить
    3. Надеюсь как будет поменьше работы продолжу блог. Но пока конца краю не видно.

      Удалить
  3. Thanks for sharing, nice post! Post really provice useful information!

    Công ty vận chuyển hàng nước ngoài FadoExpress hàng đầu chuyên vận chuyển, chuyển phát nhanh siêu tốc đi khắp thế giới, nổi bật là dịch vụ gửi hàng đi mỹ, gửi hàng đi nhậtgửi hàng đi pháp và dịch vụ chuyển phát nhanh đi hàn quốc uy tín, giá rẻ

    ОтветитьУдалить