powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите паттерн
25 сообщений из 28, страница 1 из 2
Подскажите паттерн
    #39544389
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Есть некий набор типов с именами: type1, type2, type3
По имени которое прилетает из вне мне нужно создать класс, соответствующий данному типу. Каждый класс со своим набором полей.
Делать так, как мне кажется не очень красиво:
Код: java
1.
2.
3.
if(nameType.equals("type1")){
   return new Type1Class();
} else if() ...


Подскажите какой лучше паттерн использовать для решения подобных задач?
Спасибо
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544403
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Ну, эта. Типа в фабрику надо это всё засунуть. А реализация уже зависит от того на сколько динамично у вас эти типы классы\ у вас меняются. Если список классов очень устойчивый и на каждый тип есть куча статичной бизнес-логики, то я бы это всё у enum унёс.

Более простое к изменениям решение это записать маппинг тип-класс в файл. Может быть полезным если вдруг такой маппинг надо задавать извне.

А если нужна полноценная динамика с реализациями в разных jar-ах, то есть смысл на SPI посмотреть
https://docs.oracle.com/javase/tutorial/ext/basics/spi.html

В целом, недостаточно вводных данных для принятия решения.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544405
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Ещё часто такой паттерн называют "Реестром". По-хорошему "имя типа" должен предоставлять сам тип. Но в Java это не так просто в связи с тем как реализована статика. Нет виртуальных вызовов для статических методов.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544408
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczВ целом, недостаточно вводных данных для принятия решения.
+1
Кроме того Фабричный метод требует чтобы они были наследниками абстрактного.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544414
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
Вообще, я ничего плохого в вашем коде 2 строки не вижу.
У нас if запрещён?
Много полей? Тогда Строитель.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544421
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вообще, я ничего плохого в вашем коде 2 строки не вижу.

Ничего?
- Много синтаксического шума.
- Имя типа отделено от самого типа
- Используются строки, там где должны быть константы
- Маппинг имени на тип смешан с процессом создания экземпляра
- Код не устойчив к NPE
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544428
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT,

Ну, эта. Типа в фабрику надо это всё засунуть. А реализация уже зависит от того на сколько динамично у вас эти типы классы\ у вас меняются. Если список классов очень устойчивый и на каждый тип есть куча статичной бизнес-логики, то я бы это всё у enum унёс.

Более простое к изменениям решение это записать маппинг тип-класс в файл. Может быть полезным если вдруг такой маппинг надо задавать извне.

А если нужна полноценная динамика с реализациями в разных jar-ах, то есть смысл на SPI посмотреть
https://docs.oracle.com/javase/tutorial/ext/basics/spi.html

В целом, недостаточно вводных данных для принятия решения.
Пробую так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public enum TypeResolver {
    FIRST_TYPE {
        @Override
        public TypeCreator getType() {
            return () -> new FirstTypeImpl();
        }
    },
    SECOND_TYPE {
        @Override
        public TypeCreator getType() {
            return () -> new SecondTypeImpl();
        }
    };

    public abstract TypeCreator getType();
}



Код: java
1.
2.
3.
public interface TypeCreator<T> {
    T create();
}



Код: java
1.
2.
public class FirstTypeImpl {
}



Код: java
1.
2.
public class SecondTypeImpl {
}


А если хочу параметры передать в конструктор класса?
Покритикуйте пожалуйста
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544432
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123Вообще, я ничего плохого в вашем коде 2 строки не вижу.

Ничего?
- Используются строки, там где должны быть константы
- Код не устойчив к NPE
Я не стала заморачиваться, а вообще, конечно, вы правы. Надо так:
Код: java
1.
2.
final String FIRST_TYPE = "type1";
if(FIRST_TYPE.equals(nameType)){
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544433
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123Вообще, я ничего плохого в вашем коде 2 строки не вижу.

Ничего?
- Много синтаксического шума.
- Имя типа отделено от самого типа
- Используются строки, там где должны быть константы
- Маппинг имени на тип смешан с процессом создания экземпляра
- Код не устойчив к NPE
Вы главное скажите ему когда начнется ОВЕРХЕД.
Его бывает, тоже не видно. И потом шум другого рода.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544434
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT
Код: java
1.
final String FIRST_TYPE = "type1";


Ну, это и ежу понятно.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544435
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
Вообще, я ничего плохого в вашем коде 2 строки не вижу.
У нас if запрещён?
Много полей? Тогда Строитель.
в моем случае около 20 типов имен, соответственно, 20 типов классов. Каждый класс представляет из себя холдер с параметрами для отправки http риквеста
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544445
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTмоем случае около 20 типов имен,
Вот и делают чтоб вас поняли jf ( и троеточие до 20-ти.
IMHO.
Откуда поступают 20 имён?
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544449
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTПробую так:

Уже тепло. Для нескольких типов я бы так и делал. Но для 20 энум выходит довольно кривой.

JulT
Код: java
1.
2.
3.
public interface TypeCreator<T> {
    T create();
}



Supplier

JulTА если хочу параметры передать в конструктор класса?

Разные для разных типов? Просто не понятно если параметры одинаковые, то тупо добавить в методы. Если параметры разные, то к чему вообще весь сыр-бор, если для параметров вам нужно знать и конкретный тип.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544452
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

Код: java
1.
2.
3.
4.
public enum TypeResolver {
    FIRST_TYPE(FirstTypeImpl.class),
    SECOND_TYPE (SecondTypeImpl.class)
}



Вы так и не рассказали какую именно проблему вы решаете отделя имя типа от самого типа. Можно с тем же успехом использовать полное имя класса + Class.forName().
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544461
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczJulT,

Код: java
1.
2.
3.
4.
public enum TypeResolver {
    FIRST_TYPE(FirstTypeImpl.class),
    SECOND_TYPE (SecondTypeImpl.class)
}



Вы так и не рассказали какую именно проблему вы решаете отделя имя типа от самого типа. Можно с тем же успехом использовать полное имя класса + Class.forName().
Имя типа прилетает с bpmn процесса. Прилетает в один общий метод. На основании этого типа формируется мапа с параметрами и далее происходит http запрос с передачей этих параметров. Это то, как сделано сейчас, не мной. Но дело в том, что в зависимости от типа мапа должна фаршироваться разными параметрами. В одном случае нужно передать authorID - map.put("authorID", operatorId);
в другом нет. Ставить кучу ифов мне не нравится. Поэтому и хочу по имени определять класс, в котором будет лежать свой собственный map с параметрами.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544466
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTИмя типа прилетает с bpmn процесса. Прилетает в один общий метод.
Дайте пример этих слов.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544468
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
Формирование мапы с параметрами можно заменить Строитель. Гляньте. Мож.подойдёт.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544476
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulTИмя типа прилетает с bpmn процесса. Прилетает в один общий метод.
Дайте пример этих слов.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Override
    public Response register(String type, String operatorId, String description) {
        Map<String, Object> map = new HashMap();
        map.put("authorID", operatorId);
        map.put("description", description);
        map.put("completionDate", LocalDate.now());
        map.put("type", type);

        return httpService.typeRegister(map);
    }


register - вызывается в bpmn, там простыня xml-ая
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544488
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulT,
Формирование мапы с параметрами можно заменить Строитель. Гляньте. Мож.подойдёт.
Я просто не хочу писать типа:
Код: java
1.
2.
3.
if(type.equals()){
   map.put()
}


И т.д. Более того, по типу иногда нужно сходить в базу, получить доп инфу и тоже добавить в мапу. Т.е. этих ифов в данном месте может быть много. Я хочу изолировать эту работу в классы
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544500
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,
У вас на входе тип как строка.
Посмотрите Строитель как замена register.
Если вы можете так глубоко и рано делать из строки объекты.
Imho
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544505
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTдалее происходит http запрос с передачей этих параметров.
Off ))
Если нет БЛ, то можно минуя объекты, а используя шаблоны отправить http запрос.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544510
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulTдалее происходит http запрос с передачей этих параметров.
Off ))
Если нет БЛ, то можно минуя объекты, а используя шаблоны отправить http запрос.
Я же написала выше: "Более того, по типу иногда нужно сходить в базу, получить доп инфу.."
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544515
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTЯ же написала выше: "Более того, по типу иногда нужно сходить в базу, получить доп инфу.."
Да. Отменяется.
Смотрите Вики - строитель.
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544650
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123JulTЯ же написала выше: "Более того, по типу иногда нужно сходить в базу, получить доп инфу.."
Да. Отменяется.
Смотрите Вики - строитель.
Спасибо
...
Рейтинг: 0 / 0
Подскажите паттерн
    #39544669
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTСпасибо
Вы отпишитесь о результатах).
Интересно же.
Вы там на острие технологий, bpm.
Пользователи сами ресуют БЛ)).
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите паттерн
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]