Изучаем паттерны: Cat Factory Method

Цель паттерна:

Создается специфический класс - интерфейс базового абстрактного класса (создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не тела методов). Конкретная реализация класса-наследника определяется тем, какие параметры были переданы при создании.


Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.


Используется в следующих случаях:


- класс не имеет информации о том, какой тип объекта он должен создать;

- класс передает ответственность по созданию объектов наследникам;

- необходимо создать объект в зависимости от входящих данных.


Реализация класса:

Создается класс-интерфейс Cat и реализацию его функций в потомках класса Cat. Далее создается класс-фабрика CatFactory.


Класс CatFactoryDemo использует класс-фабрику CatFactory для создания объектов класса Cat. Мы передаем параметр - коэффициент веса кота, для определения того, какой кот будет создан с помощью функции getCatMassFactor().

Шаг первый:


Создаем класс-интерфейс Cat.java

Шаг второй:

Создаем классы, имеющие интерфейс Cat и реализацией метода toJump()


ThinCat.java

NormalCat.java

FatCat.java

Шаг третий:

Создаем класс-фабрику CatFactory для генерирования различных объектов класса Cat на основе переданной в класс-фабрику CatFactory информации.


CatFactory.java

Шаг четвертый:

Создаем класс CatFactoryDemo, который использует класс-фабрику CatFactory для создания объектов класса Cat.


CatFactoryDemo.java

Программа выведет результат:


ThinCat has jumped-up like a bird.

NormalCat has jumped-up.

FatCat can't jump.

Главный минус метода - необходимость создавать наследника Creator для каждого нового типа продукта.

На том и откланяюсь.) уж больно спать хочется)

Правила сообщества

Прошу воздержаться от взаимных оскорблений.

Больше позитива, ведь программирование - это весело)

0
Автор поста оценил этот комментарий

В целом норм. Хотя, конечно, не нужно принимать статью за непреклонную истину (есть неточности и опечатки), а зайти еще, скажем, сюда: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE... (там список паттернов и на их страницах есть реализация на Java), ну и подумать еще самому, потому что фабрику используют почти в каждой программе и нужно хорошо расшарить особенности ее реализации:


1) Комментатор выше уже написал про статичную фабрику. Также есть вариант сделать ее синглтоном (еще один супер-важный паттерн).

2) Надо убрать модификатор public у классов Thin, Normal и FatCat. Тогда с этими классами будет работать лишь фабрика, а другим про их существование знать необязательно.

3) null в фабрике возвращать не стоит, потому что ситуация исключительная. Лучше выбросить какой-нибудь IllegalArgumentException, если масса <= 0.


Главный минус метода - необходимость создавать наследника Creator для каждого нового типа продукта.

Это предложение удалить надо.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Редактировать уже нельзя
Иллюстрация к комментарию
показать ответы
3
Автор поста оценил этот комментарий
1) в первом ифе в фабрике - сравнение инта и дабла. Плохой тон. Так уж я научен.

2)

catFactory.getMassFactor(0.0).toJump() // ;P
catFactory.getMassFactor(0.5).toJump() // ;]
catFactory.getMassFactor(1.5).toJump() // ;D

если умышленно - хорошо бы ручные эксепшны высирать. Или хотя бы сообщение об ошибке. А то тупо НПЕ без обьяснений - потом сидишь дебажишь. Особенно если код многопоточный.

3) да и фабрику тогда уж статичной запилить.
4) а где в посте вообще Creator? Подозреваю, что речь о фабрике.

такие мелочи новички неосознанно считают за истину в последней инстанции (хотя и не думают про них). Как и для ребенка родители - инь и янь.

и напомнило старую рекламу женской косметики )
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Что значит запилить фабрику статичной, не нашел)

показать ответы
1
Автор поста оценил этот комментарий
Мне кажется, для данного примера больше подходит паттерн фабричный метод, тем более, что он по сути тут и реализован.
И ещё, на будущее, я бы добавил, что название метода getMaxFactor() больше подходит для геттера или расчёта этого самого фактора, а для метода создающего более очевидно (для пользователя) выбрать метод с названием create() или createByMaxFactor() - ну это так, больше к стилю :)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Ну да, я обратил вчера внимание, что get тут коряво выглядит)
3
Автор поста оценил этот комментарий
1) в первом ифе в фабрике - сравнение инта и дабла. Плохой тон. Так уж я научен.

2)

catFactory.getMassFactor(0.0).toJump() // ;P
catFactory.getMassFactor(0.5).toJump() // ;]
catFactory.getMassFactor(1.5).toJump() // ;D

если умышленно - хорошо бы ручные эксепшны высирать. Или хотя бы сообщение об ошибке. А то тупо НПЕ без обьяснений - потом сидишь дебажишь. Особенно если код многопоточный.

3) да и фабрику тогда уж статичной запилить.
4) а где в посте вообще Creator? Подозреваю, что речь о фабрике.

такие мелочи новички неосознанно считают за истину в последней инстанции (хотя и не думают про них). Как и для ребенка родители - инь и янь.

и напомнило старую рекламу женской косметики )
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Первый if пропустил, остальное небольшая переделка статьишhttp://www.tutorialspoint.com/design_pattern/design_pattern_...
Ну да, фабрику и новые классы надо делать тогда)
показать ответы
0
Автор поста оценил этот комментарий
есть разница - скормили стринг не тот (и то это для простоты понимания туториала) или дабл, равный полутора и с NPE в результате. Т.е. даже идеологически - раз уж у нас тут коты - котов с весом 0.5 быть не должно.

что за дискриминация? Где-то взгрустнул один котик с весом в 0.5 условных единиц. А ведь он того не заслужил.

как и переедок полутораш. Подумаешь, кушать любит.

в общем, bad habit
раскрыть ветку (1)
Автор поста оценил этот комментарий
Коэффициент массы - отношение роста, длины к весу) конкретные значения надо уточнять)
Иллюстрация к комментарию

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества