Abstarct Factory Pattern

Тип: порождающий шаблон


Назначение: обеспечивает создание семейств взаимосвязанных или зависящих друг от друга

объектов без указания их конкретных классов.

Является развитием паттерна Factory Method.

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

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

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

- объекты внутри семейства взаимосвязаны.


Программа обращается к классу-конструктору фабрик FactoryProducer, создавая два класса-фабрики CatFactory и DogFactory - наследники с реализацией абстрактного класса AbstractFactory. Классы фабрики создают 3 объекта класса Cat и 3 объекта класса Dog.

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем классы-интерфейсы Cat и Dog:

Cat.java, Dog.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост
Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем наследников класса Cat с реализацией его функций:

ThinCat.java, NormalCat.java, FatCat.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем наследников класса Dog с реализацией его функций:

ThinDog.java, NormalDog.java, FatDog.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем абстрактный класс AbstractFactory:

AbstractFactory.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем классы-фабрики CatFactory и DogFactory:

CatFactory.java, DogFactory.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Создаем класс-конструктор фабрик FactoryProducer:

FactoryProducer.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Основной класс AbstractFactoryPatternCvsD:

AbstractFactoryPatternCvsD.java

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост
Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

И что выводит программа:

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

С вами был Salem, на 100 лет проклятый быть криворуким программистом...

Abstarct Factory Pattern Java, Паттерны, Программирование, Длиннопост

Задачки для изучающих Java

43 поста1.8K подписчика

Добавить пост

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

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

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

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

В методе createFight() строчки System.out.printn(curDog + " attacks " + curCat) выносятся на уровень выше. Тогда их будет не 9, а 3.

Совет: перед кодом выкладывай скриншот структуры классов.

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Ок, в следующий раз так и сделаю)
Иллюстрация к комментарию
1
Автор поста оценил этот комментарий
germanTanks.add(germanTankFactory.createGermanTank("LIGHT"));
Конечно, лучше делать enum TankType: heavy, medium, light и создавать в фабрике танк именно по нему. Это замечание актуально и для предыдущих примеров.
раскрыть ветку (1)
Автор поста оценил этот комментарий

Как правильно это сделать, а то у меня какая-то фигня получилась(

import static App.Tanks.FactoryProducer.TankType.GERMAN;

import static App.Tanks.FactoryProducer.TankType.USSR;

TankFactory ussrTankFactory = FactoryProducer.getFactory(USSR);

показать ответы
1
Автор поста оценил этот комментарий
Ага, не работает. Ну это редко бывает с ним.

Нужно посмотреть видеоурок на эту тему. Вроде этот ничего: https://www.youtube.com/watch?v=dO883S85d_k

Или этот: https://www.youtube.com/watch?v=zM6z57OtR2Q

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

Гитхаб оказывается блочится в России) как проксю подрубил сразу все нормально стало открываться)

1
Автор поста оценил этот комментарий
Ага, не работает. Ну это редко бывает с ним.

Нужно посмотреть видеоурок на эту тему. Вроде этот ничего: https://www.youtube.com/watch?v=dO883S85d_k

Или этот: https://www.youtube.com/watch?v=zM6z57OtR2Q

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

Все сработало, я не то жал) https://github.com/Norfin85/TankBattle

1
Автор поста оценил этот комментарий
да, нужно только создавать репозиторий в гитхабе и сказать его идее, а дальше она сама все делать будет
раскрыть ветку (1)
Автор поста оценил этот комментарий
Не получилось))) и гит хаб почти не открывается
показать ответы
1
Автор поста оценил этот комментарий
germanTanks.add(germanTankFactory.createGermanTank("LIGHT"));
Конечно, лучше делать enum TankType: heavy, medium, light и создавать в фабрике танк именно по нему. Это замечание актуально и для предыдущих примеров.
раскрыть ветку (1)
Автор поста оценил этот комментарий
Я вот думаю бой сделать так:
Идет таймер, каждый тик даются танку очки действия, сначала он их тратит на разворот, а затем на выстрелы, если система сгенерировала лоб в лоб, то кидается кубик, кто первый
1
Автор поста оценил этот комментарий
вот, к примеру, мой аккаунт: https://github.com/Generalus?tab=repositories
Вообще, пакеты и все остальное делают в среде разработки.
раскрыть ветку (1)
Автор поста оценил этот комментарий
А, т.е. закидывать всю папку с проектом из idea?)
показать ответы
1
Автор поста оценил этот комментарий

На каждый паттерн свой репозиторий создавать - весьма утомительно - не получится коммитить прямо из ide'и, а каждый раз заходить на гитхаб. Также классы паттерна нужно раскидать по пакетам: cats, dogs, factories. Когда смотришь на список классов без пакетирования, очень сложно угадать используемый паттерн.

раскрыть ветку (1)
Автор поста оценил этот комментарий
А можно пример, как на гитхабе пакетируют?
показать ответы
1
Автор поста оценил этот комментарий

На каждый паттерн свой репозиторий создавать - весьма утомительно - не получится коммитить прямо из ide'и, а каждый раз заходить на гитхаб. Также классы паттерна нужно раскидать по пакетам: cats, dogs, factories. Когда смотришь на список классов без пакетирования, очень сложно угадать используемый паттерн.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Теперь мне нужно осознать все выше сказанное...)
Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Кто ж так делает) Создай репозиторий Patterns, в него загрузи соответствующий проект (в пакете ru.norfin85.patterns по пакету с классами на каждый паттерн). Архивов не должно быть никаких в принципе.

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

Немного исправил)

еще добавил танки, но код пока не работает

https://github.com/Norfin85/Tank

показать ответы
1
Автор поста оценил этот комментарий

Кто ж так делает) Создай репозиторий Patterns, в него загрузи соответствующий проект (в пакете ru.norfin85.patterns по пакету с классами на каждый паттерн). Архивов не должно быть никаких в принципе.

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

В виде списка файлов?

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

В методе createFight() строчки System.out.printn(curDog + " attacks " + curCat) выносятся на уровень выше. Тогда их будет не 9, а 3.

Совет: перед кодом выкладывай скриншот структуры классов.

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

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

Серьезно блять? Давай еще может GoF по страницам выкладыать на пикабу?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Примеры - то небольшие, спокойнее надо быть)
Иллюстрация к комментарию
Автор поста оценил этот комментарий

Почему нельзя было сделать все через массив с двумя переменными: кошка/собака и худая/нормальная/толстая?

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

Это будет уже не ООП программирование. Примеры специально на столько простые, чтобы можно было разобраться в алгоритме паттерна, по-жизни все будет посложнее.)

показать ответы