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.

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

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

раскрыть ветку (19)
1
Автор поста оценил этот комментарий
Ок, в следующий раз так и сделаю)
Иллюстрация к комментарию
Автор поста оценил этот комментарий
раскрыть ветку (17)
1
Автор поста оценил этот комментарий

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

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

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

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

https://github.com/Norfin85/Tank

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

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

раскрыть ветку (9)
Автор поста оценил этот комментарий
Теперь мне нужно осознать все выше сказанное...)
Иллюстрация к комментарию
Автор поста оценил этот комментарий
А можно пример, как на гитхабе пакетируют?
раскрыть ветку (7)
1
Автор поста оценил этот комментарий
вот, к примеру, мой аккаунт: https://github.com/Generalus?tab=repositories
Вообще, пакеты и все остальное делают в среде разработки.
раскрыть ветку (6)
Автор поста оценил этот комментарий
А, т.е. закидывать всю папку с проектом из idea?)
раскрыть ветку (5)
1
Автор поста оценил этот комментарий
да, нужно только создавать репозиторий в гитхабе и сказать его идее, а дальше она сама все делать будет
раскрыть ветку (4)
Автор поста оценил этот комментарий
Не получилось))) и гит хаб почти не открывается
раскрыть ветку (3)
1
Автор поста оценил этот комментарий
Ага, не работает. Ну это редко бывает с ним.

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

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

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

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

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

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

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

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

TankFactory ussrTankFactory = FactoryProducer.getFactory(USSR);

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

public enum TankType {

      HEAVY, MEDIUM, LIGHT

}

public enum FactoryType {

      USSR, GERMANY

}


и при вызове

TankFactory ussrTankFactory = FactoryProducer.getFactory(FactoryType.USSR);

Автор поста оценил этот комментарий
Я вот думаю бой сделать так:
Идет таймер, каждый тик даются танку очки действия, сначала он их тратит на разворот, а затем на выстрелы, если система сгенерировала лоб в лоб, то кидается кубик, кто первый
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку