Шаблон Java Factory ⇐ JAVA
-
Anonymous
Шаблон Java Factory
У меня есть модуль A и модуль B, каждый из которых имеет определенные службы, и у меня есть модуль C, который не имеет никаких зависимостей от A и B, поэтому я хочу вызывать службы из модулей A и B, и я хочу добиться этого, используя фабричный шаблон.
в модуле C я создал этот интерфейс, и это будет общий интерфейс, который будет реализован в модулях A и B
публичный интерфейс ThirdPartyCallsStrategy { void Apply (String orderId); } Это пример фабричного класса, который предоставит соответствующий экземпляр на основе параметра типа
@Component @AllArgsConstructor общественный класс CoreCallsFactory { частная статическая окончательная строка A_PACKAGE = "com.testA.service"; частная статическая окончательная строка A_CLASS = «TestClassA»; частная статическая окончательная строка B_PACKAGE = "com.testB.service"; частная статическая окончательная строка B_CLASS = «TestClassA»; @SneakyThrows public ThirdPartyCallsStrategy createThirdPartyCallsStrategy (тип String) { Класс clazz; если (type.equals("A")) { clazz = Class.forName(String.format("%s.%s", A_PACKAGE, A_CLASS)); return (ThirdPartyCallsStrategy) clazz.getDeclaredConstructor().newInstance(); } если (type.equals("B")) { clazz = Class.forName(String.format("%s.%s", B_PACKAGE, B_CLASS)); return (ThirdPartyCallsStrategy) clazz.getDeclaredConstructor().newInstance(); } вернуть ноль; } } ThirdPartyCallsStrategy реализуется в разных сервисах в разных модулях
И, наконец, в модуле C я создаю экземпляр посредством отражения Java, но это будет во время выполнения, и это может быть сделано через исключения позже во время выполнения, а не во время компиляции
public String checkStatusAndRedirect(String orderId, String type) { логический статус = checkStatus (orderId); StringBuilder PaymentResultUrl = новый StringBuilder(frontUrl + "/public/Payment/status?success="); если (статус) { coreCallsFactory.createThirdPartyCallsStrategy(тип).apply(orderId); платежResultUrl.append(Boolean.TRUE); } еще { платежResultUrl.append(Boolean.FALSE); } вернуть платежResultUrl.toString(); } Итак, мне нужен более чистый способ изменить эту реализацию.
У меня есть модуль A и модуль B, каждый из которых имеет определенные службы, и у меня есть модуль C, который не имеет никаких зависимостей от A и B, поэтому я хочу вызывать службы из модулей A и B, и я хочу добиться этого, используя фабричный шаблон.
в модуле C я создал этот интерфейс, и это будет общий интерфейс, который будет реализован в модулях A и B
публичный интерфейс ThirdPartyCallsStrategy { void Apply (String orderId); } Это пример фабричного класса, который предоставит соответствующий экземпляр на основе параметра типа
@Component @AllArgsConstructor общественный класс CoreCallsFactory { частная статическая окончательная строка A_PACKAGE = "com.testA.service"; частная статическая окончательная строка A_CLASS = «TestClassA»; частная статическая окончательная строка B_PACKAGE = "com.testB.service"; частная статическая окончательная строка B_CLASS = «TestClassA»; @SneakyThrows public ThirdPartyCallsStrategy createThirdPartyCallsStrategy (тип String) { Класс clazz; если (type.equals("A")) { clazz = Class.forName(String.format("%s.%s", A_PACKAGE, A_CLASS)); return (ThirdPartyCallsStrategy) clazz.getDeclaredConstructor().newInstance(); } если (type.equals("B")) { clazz = Class.forName(String.format("%s.%s", B_PACKAGE, B_CLASS)); return (ThirdPartyCallsStrategy) clazz.getDeclaredConstructor().newInstance(); } вернуть ноль; } } ThirdPartyCallsStrategy реализуется в разных сервисах в разных модулях
И, наконец, в модуле C я создаю экземпляр посредством отражения Java, но это будет во время выполнения, и это может быть сделано через исключения позже во время выполнения, а не во время компиляции
public String checkStatusAndRedirect(String orderId, String type) { логический статус = checkStatus (orderId); StringBuilder PaymentResultUrl = новый StringBuilder(frontUrl + "/public/Payment/status?success="); если (статус) { coreCallsFactory.createThirdPartyCallsStrategy(тип).apply(orderId); платежResultUrl.append(Boolean.TRUE); } еще { платежResultUrl.append(Boolean.FALSE); } вернуть платежResultUrl.toString(); } Итак, мне нужен более чистый способ изменить эту реализацию.
Мобильная версия